From c4edc751be0c6badd3dcba6a5edb06ee0480187f Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 28 Sep 2026 13:15:24 +0900 Subject: [PATCH] =?UTF-8?q?fix(spreadsheet):=20=ED=9A=8C=EA=B3=84=200=20?= =?UTF-8?q?=EA=B5=AC=EC=97=AD=20'=3F'=20=EC=9E=90=EB=A6=AC=20=EB=B9=88?= =?UTF-8?q?=EC=B9=B8=20=EC=B2=98=EB=A6=AC=20=C2=B7=20=ED=86=B5=ED=99=94=20?= =?UTF-8?q?=EB=A1=9C=EC=BA=98=20=ED=83=9C=EA=B7=B8=20=EB=8C=80=EC=A1=B0=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 브레인이 짐작한 [$-412](로캘만 · 기호 없음) 이 통화 기호로 잘못 바뀌는지 여러 실제 꼴(단순 태그·회계 네 구역·접두/접미 위치)로 대조해 봤으나 지금 코드는 이미 옳게 기호를 안 보임(회귀 시험으로 고정). 그 김에 회계 0 구역의 `"-"??` 관용구가 진짜 0 값에서 정수부 `?` 를 「0」 으로 채우던 것을 고쳐 엑셀처럼 빈칸으로 보이게 함. 사용자가 보고한 ₩ 는 이 두 경로로는 재현이 안 돼 — main_desktop_1 의 fixture_excel_user_won.html 이 아직 안 와서 실제 원문으로는 대조 못 함(오면 바로 대조). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01RrQ65VtGZbae2VKgYVMhmc --- A00_Common/spreadsheet/spreadsheet_numfmt.ts | 6 +++++- .../tester/spreadsheet/spreadsheet_b_test_entry.ts | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/A00_Common/spreadsheet/spreadsheet_numfmt.ts b/A00_Common/spreadsheet/spreadsheet_numfmt.ts index b2c277f2..66215037 100644 --- a/A00_Common/spreadsheet/spreadsheet_numfmt.ts +++ b/A00_Common/spreadsheet/spreadsheet_numfmt.ts @@ -185,7 +185,11 @@ function renderNumericSection(toks: Tok[], magnitude: Frac): string { const rawFracStr = fracDigitToks.length > 0 ? allDigits.slice(-fracDigitToks.length) : ""; let intStr = rawIntStr; - if (intDigitToks.length > intStr.length) { + // 정수부가 온통 `?`(회계 형식 0 구역의 `"-"??` 자리맞춤 버릇)뿐이고 값이 정말 0 이면 + // 자리마다 빈칸(엑셀은 `?` 를 「있으면 숫자 · 없으면 빈칸」으로 봄 — `0` 처럼 0 을 안 채움). + if (intDigitToks.length > 0 && rawIntStr === "0" && intDigitToks.every((t) => t.ch === "?")) { + intStr = " ".repeat(intDigitToks.length); + } else if (intDigitToks.length > intStr.length) { const need = intDigitToks.length - intStr.length; let pad = ""; for (let i = 0; i < need; i++) pad += intDigitToks[i].ch === "0" ? "0" : ""; diff --git a/resources/tester/spreadsheet/spreadsheet_b_test_entry.ts b/resources/tester/spreadsheet/spreadsheet_b_test_entry.ts index 6d739c64..cbdc8ca3 100644 --- a/resources/tester/spreadsheet/spreadsheet_b_test_entry.ts +++ b/resources/tester/spreadsheet/spreadsheet_b_test_entry.ts @@ -441,6 +441,16 @@ ok( fmt(frac(2n), '_-[$€-2]* #,##0.00_-;-[$€-2]* #,##0.00_-;_-[$€-2]* "-"??_-') === " €2.00 ", fmt(frac(2n), '_-[$€-2]* #,##0.00_-;-[$€-2]* #,##0.00_-;_-[$€-2]* "-"??_-'), ); +ok( + "회계형 0 구역 '-'?? 는 자리만(0 안 보임)", + fmt(frac(0n), '_-[$-412]* #,##0.00_-;-[$-412]* #,##0.00_-;_-[$-412]* "-"??_-') === " - ", + JSON.stringify(fmt(frac(0n), '_-[$-412]* #,##0.00_-;-[$-412]* #,##0.00_-;_-[$-412]* "-"??_-')), +); +ok( + "통화 로캘 태그만([$-412] · 기호 없음)은 통화 기호를 안 보임", + !fmt(frac(2n), "[$-412]#,##0.00").includes("₩") && fmt(frac(2n), "[$-412]#,##0.00") === "2.00", + fmt(frac(2n), "[$-412]#,##0.00"), +); ok("따옴표 접두·접미", fmt(frac(800n), '"φ"###') === "φ800", fmt(frac(800n), '"φ"###')); ok( "음수 회계형",