- 파이썬 짝을 common_util/common_util_money.py 로 옮김(TS 와 같은 이름 · 서버 어디서나 불러옴) - 시험 계산: 율 글자 「4.0 %」 → 숫자 4(서버 _pct) · 중간 값 경비 · 공구손료 등 비목 이름은 1,000 미만도 돈 꼴(870.2455 → 870) - 기초 편집 단가 = 공용 단가 꼴 · 금액 = 소수 1 · 서고 기준 금액 · 구조물 조합 일위대가 금액 = 공용 정수 꼴(124,419.85 → 124,420) - 마법사(확인 · 고르기 · 별칭 장부 · 엑셀 · 우리 금액): 콤마 없음 · 소수 셋 기본 · 부동소수 꼬리 걷음 · 품 비교 꼬리표 지수 꼴(1.235e+05) 걷음 - 다시 잇기 · 붙여넣기 대조 · 찾아 넣기 금액 열 끝 0 없음(22.9 원이 23 으로 숨지 않음) · 흐름 로직 텍스트 수식 비목 소계 정수 - 낡은 시험 고침: test_m02_hopyo_screen 품 비교 보통인부 0.0364 → 0.03636(수량 꼴 유효숫자 넷 규칙으로 파이썬 · TS 통일) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
47 lines
2.1 KiB
TypeScript
47 lines
2.1 KiB
TypeScript
/* =============================================================================
|
|
* common_util_money.ts
|
|
* 화면 숫자 글 꼴 한 벌 — 금액 · 단가 · 수량 · 율 · 빈 값 · 음수. 셈 값은 그대로, 보이는 글만 만듦(반올림).
|
|
* formatMoney 원 단위 정수 (계 · 소계 · 합계 · 내역 금액)
|
|
* formatLineMoney 최대 소수 1 · 끝 0 뗌 (일위대가 줄 금액 · 산근 근거 줄)
|
|
* formatPrice 단가 — 200 원 미만 = 유효숫자 넷 · 그 밖 = 최대 소수 3 · 끝 0 뗌
|
|
* formatNumber 수량 · 율 · 품 — 소수 넷째 자리 · 유효숫자 넷 중 많은 쪽 · 끝 0 뗌
|
|
* 값이 숫자가 아니면 빈 값 = 「」 · 객체 = JSON 글 · 그 밖 = String.
|
|
* 짝: `common_util/common_util_money.py` (거울 시험 `resources/tester/test_588_2_money_fmt.py`).
|
|
* ========================================================================== */
|
|
|
|
const LOCALE = "ko-KR";
|
|
|
|
function fixed(value: number, maxDigits: number): string {
|
|
const text = value.toLocaleString(LOCALE, { maximumFractionDigits: Math.min(20, maxDigits) });
|
|
return text === "-0" ? "0" : text;
|
|
}
|
|
|
|
/** 수량 꼴 자리 — 소수 넷째 자리 · 유효숫자 넷 중 많은 쪽 (0.00167 → 0.00167) */
|
|
function numberPlaces(value: number): number {
|
|
return value === 0 || !Number.isFinite(value)
|
|
? 4
|
|
: Math.max(4, 3 - Math.floor(Math.log10(Math.abs(value))));
|
|
}
|
|
|
|
function other(value: unknown): string {
|
|
if (value === null || value === undefined) return "";
|
|
return typeof value === "object" ? JSON.stringify(value) : String(value);
|
|
}
|
|
|
|
export function formatNumber(value: unknown): string {
|
|
return typeof value === "number" ? fixed(value, numberPlaces(value)) : other(value);
|
|
}
|
|
|
|
export function formatMoney(value: unknown): string {
|
|
return typeof value === "number" ? fixed(value, 0) : other(value);
|
|
}
|
|
|
|
export function formatLineMoney(value: unknown): string {
|
|
return typeof value === "number" ? fixed(value, 1) : other(value);
|
|
}
|
|
|
|
export function formatPrice(value: unknown): string {
|
|
if (typeof value !== "number") return other(value);
|
|
return Math.abs(value) < 200 ? formatNumber(value) : fixed(value, 3);
|
|
}
|