- 파이썬 짝을 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>
67 lines
2.2 KiB
Python
67 lines
2.2 KiB
Python
"""원화 꼴 한 벌 거울 시험 — `common_util_money.py`(파이썬) ↔ `common_util_money.ts`(TS · Node) 가 같은 글.
|
|
|
|
CLAUDE.md 5장 ① 짝. 값은 숫자 글(`num`) · 숫자 아닌 글(`text`) · 빈 값(None).
|
|
"""
|
|
|
|
import json
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
from decimal import Decimal
|
|
|
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
sys.path.insert(0, os.path.join(HERE, "..", ".."))
|
|
|
|
from common_util import common_util_money as mf # noqa: E402
|
|
|
|
NUMS = [
|
|
"0", "1", "2.5", "-1234.5", "1.00005", "0.12345", "0.00167", "22.9", "1846.39",
|
|
"124419.853", "275790", "69643.9394", "0.2525", "4", "199.99", "200", "1234567.891",
|
|
"-0.00001", "0.05", "870.2455", "59020", "1414.9", "-22.96",
|
|
] # fmt: skip
|
|
CASES = [{"num": n} for n in NUMS] + [{"text": "가나다"}, {"text": ""}, None]
|
|
PAIRS = {
|
|
"formatNumber": mf.fmt,
|
|
"formatMoney": mf.fmt_money,
|
|
"formatLineMoney": mf.fmt_line_money,
|
|
"formatPrice": mf.fmt_price,
|
|
}
|
|
|
|
|
|
def _ts() -> dict:
|
|
proc = subprocess.run(
|
|
["node", os.path.join(HERE, "helper_588_2_money_fmt.cjs")],
|
|
input=json.dumps(CASES, ensure_ascii=False),
|
|
capture_output=True,
|
|
text=True,
|
|
encoding="utf-8",
|
|
check=True,
|
|
)
|
|
return json.loads(proc.stdout)
|
|
|
|
|
|
def _py_value(case):
|
|
if case is None:
|
|
return None
|
|
return Decimal(case["num"]) if "num" in case else case["text"]
|
|
|
|
|
|
def test_python_ts_same_text():
|
|
ts_out = _ts()
|
|
for name, py_fn in PAIRS.items():
|
|
for case, ts_text in zip(CASES, ts_out[name]):
|
|
assert py_fn(_py_value(case)) == ts_text, (name, case)
|
|
|
|
|
|
def test_known_shapes():
|
|
assert mf.fmt(Decimal("1.00005")) == "1.0001"
|
|
assert mf.fmt(Decimal("0.00167")) == "0.00167"
|
|
assert mf.fmt(Decimal("4")) == "4" # 율 — 「4 %」 (「4.0」 아님)
|
|
assert mf.fmt_money(Decimal("124419.853")) == "124,420"
|
|
assert mf.fmt_line_money(Decimal("69643.9394")) == "69,643.9"
|
|
assert mf.fmt_line_money(Decimal("18064")) == "18,064" # 「.0」 꼬리 없음
|
|
assert mf.fmt_price(Decimal("1846.39")) == "1,846.39" # 정수로 숨기지 않음
|
|
assert mf.fmt_price(Decimal("22.9")) == "22.9"
|
|
assert mf.fmt_money(Decimal("-0.4")) == "0"
|
|
assert mf.fmt(None) == "" and mf.fmt("가") == "가"
|