summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-11-02 18:15:09 +0900
committerjoonhoekim <26rote@gmail.com>2025-11-02 18:15:09 +0900
commit12cbc70c65a8588b85af3d90b527e16a0a9f8e21 (patch)
treee32502988f90e5d1a38b2a6816c146cc01288b9c /lib
parent503ff56f5471818472eeb44b74cb35c4f977e6d1 (diff)
(김준회) 공통: 숫자 , 구분 (3자리) 공통함수 추가 및 PO 금액 컬럼들에 적용, currency 정보에 따라 표기하도록 분기 처리
Diffstat (limited to 'lib')
-rw-r--r--lib/po/vendor-table/shi-vendor-po-columns.tsx7
-rw-r--r--lib/utils.ts45
2 files changed, 48 insertions, 4 deletions
diff --git a/lib/po/vendor-table/shi-vendor-po-columns.tsx b/lib/po/vendor-table/shi-vendor-po-columns.tsx
index 2aa7996b..64c95d32 100644
--- a/lib/po/vendor-table/shi-vendor-po-columns.tsx
+++ b/lib/po/vendor-table/shi-vendor-po-columns.tsx
@@ -18,6 +18,7 @@ import {
TooltipTrigger,
} from "@/components/ui/tooltip"
import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header"
+import { formatNumber } from "@/lib/utils"
import { VendorPO } from "./types"
@@ -212,7 +213,7 @@ export function getShiVendorColumns({
),
cell: ({ row }) => {
const amount = row.getValue("totalAmount") as string | number
- return <div className="text-sm text-right font-mono">{amount || '-'}</div>
+ return <div className="text-sm text-right font-mono">{formatNumber(amount)}</div>
},
size: 120,
},
@@ -267,8 +268,8 @@ export function getShiVendorColumns({
<DataTableColumnHeaderSimple column={column} title="환율" />
),
cell: ({ row }) => {
- const rate = row.getValue("exchangeRate") as string
- return <div className="text-sm font-mono">{rate || '-'}</div>
+ const rate = row.getValue("exchangeRate") as string | number
+ return <div className="text-sm text-right font-mono">{formatNumber(rate)}</div>
},
size: 100,
},
diff --git a/lib/utils.ts b/lib/utils.ts
index dab65b37..98142389 100644
--- a/lib/utils.ts
+++ b/lib/utils.ts
@@ -236,7 +236,7 @@ export function formatHtml(html: string): string {
return html; // 이미 포맷팅된 것으로 보임
}
- let formatted = html
+ const formatted = html
// 태그 앞뒤 공백 정리
.replace(/>\s*</g, '><')
// 블록 요소들 앞에 줄바꿈
@@ -290,3 +290,46 @@ export function compareItemNumber(a?: string, b?: string) {
return as.length - bs.length;
}
+/**
+ * 숫자를 3자리마다 콤마(,)로 구분하여 포맷팅합니다.
+ *
+ * @param value 포맷팅할 숫자 (number, string, null, undefined 허용)
+ * @param decimals 소수점 자릿수 (선택, 지정하지 않으면 원본 소수점 유지)
+ * @returns 포맷된 문자열 (예: "1,234,567.89")
+ *
+ * @example
+ * formatNumber(1234567) // "1,234,567"
+ * formatNumber(1234567.89) // "1,234,567.89"
+ * formatNumber(1234567.89, 1) // "1,234,567.9"
+ * formatNumber(null) // "-"
+ * formatNumber("1234567") // "1,234,567"
+ */
+export function formatNumber(
+ value: number | string | null | undefined,
+ decimals?: number
+): string {
+ // null, undefined, 빈 문자열 처리
+ if (value === null || value === undefined || value === '') {
+ return '-';
+ }
+
+ // 문자열을 숫자로 변환
+ const numValue = typeof value === 'string' ? parseFloat(value) : value;
+
+ // NaN 체크
+ if (isNaN(numValue)) {
+ return '-';
+ }
+
+ // 소수점 자릿수가 지정된 경우
+ if (decimals !== undefined) {
+ return numValue.toLocaleString('en-US', {
+ minimumFractionDigits: decimals,
+ maximumFractionDigits: decimals,
+ });
+ }
+
+ // 소수점 자릿수가 지정되지 않은 경우 (원본 소수점 유지)
+ return numValue.toLocaleString('en-US');
+}
+