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/master_template/material/rv.json b/resources/master_template/material/rv.json index 9429efbc..3f3a6ad6 100644 --- a/resources/master_template/material/rv.json +++ b/resources/master_template/material/rv.json @@ -3,15 +3,1423 @@ "판": 1, "열": "rv", "서식": [ - {} + {}, + { + "가로": "center", + "테두리": { + "위": { + "선": "hair" + }, + "왼": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "Fixed", + "테두리": { + "위": { + "선": "hair" + } + } + }, + { + "가로": "center", + "테두리": { + "위": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "0.0", + "테두리": { + "위": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "0", + "테두리": { + "위": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "_ * #,##0.00_ \\", + "테두리": { + "위": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "_-* #,##0.00_-\\", + "테두리": { + "위": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "0%", + "테두리": { + "위": { + "선": "hair" + } + } + }, + { + "테두리": { + "위": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "0.00_)\\", + "테두리": { + "위": { + "선": "hair" + } + } + }, + { + "가로": "center", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + }, + "왼": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "Fixed", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "_-* #,##0_-\\", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "_-* #,##0.0_-\\", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "0.0", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "_-* #,##0.00_-\\", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + } + } + }, + { + "형식": "_-* #,##0.00_-\\", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + } + } + }, + { + "가로": "left", + "형식": "0.0", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + } + } + }, + { + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + } + } + }, + { + "형식": "0.0", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "0.00_)\\", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "테두리": { + "아래": { + "선": "hair" + }, + "왼": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "Fixed", + "테두리": { + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "테두리": { + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "0.0", + "테두리": { + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "0", + "테두리": { + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "_ * #,##0.00_ \\", + "테두리": { + "아래": { + "선": "hair" + } + } + }, + { + "테두리": { + "아래": { + "선": "hair" + } + } + }, + { + "가로": "center", + "형식": "0.00_)\\", + "테두리": { + "아래": { + "선": "hair" + } + } + }, + { + "가로": "left", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + }, + "왼": { + "선": "thin" + }, + "오른": { + "선": "hair" + } + } + }, + { + "가로": "center", + "테두리": { + "위": { + "선": "hair" + }, + "오른": { + "선": "hair" + } + } + }, + { + "테두리": { + "위": { + "선": "hair" + }, + "오른": { + "선": "thin" + } + } + }, + { + "가로": "center", + "테두리": { + "아래": { + "선": "hair" + }, + "왼": { + "선": "thin" + }, + "오른": { + "선": "hair" + } + } + }, + { + "가로": "center", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + }, + "왼": { + "선": "hair" + }, + "오른": { + "선": "hair" + } + } + }, + { + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "hair" + }, + "오른": { + "선": "thin" + } + } + }, + { + "테두리": { + "아래": { + "선": "hair" + }, + "오른": { + "선": "thin" + } + } + }, + { + "가로": "center" + }, + { + "가로": "center", + "형식": "Fixed" + }, + { + "가로": "center", + "형식": "0.0" + }, + { + "가로": "center", + "형식": "0" + }, + { + "가로": "center", + "형식": "_ * #,##0.00_ \\" + }, + { + "가로": "center", + "형식": "_-* #,##0.00_-\\" + }, + { + "테두리": { + "오른": { + "선": "thin" + } + } + }, + { + "가로": "left", + "테두리": { + "아래": { + "선": "thin" + }, + "왼": { + "선": "thin" + }, + "오른": { + "선": "hair" + } + } + }, + { + "가로": "center", + "테두리": { + "아래": { + "선": "thin" + }, + "오른": { + "선": "hair" + } + } + }, + { + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "thin" + } + } + }, + { + "가로": "center", + "형식": "Fixed", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "thin" + } + } + }, + { + "가로": "center", + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "thin" + } + } + }, + { + "가로": "center", + "테두리": { + "아래": { + "선": "thin" + } + } + }, + { + "가로": "center", + "형식": "0.00_)\\", + "테두리": { + "아래": { + "선": "thin" + } + } + }, + { + "테두리": { + "위": { + "선": "hair" + }, + "아래": { + "선": "thin" + }, + "오른": { + "선": "thin" + } + } + } ], "시트": [ { "id": "s1", "이름": "재료산출", - "칸": {} + "칸": { + "C9": { + "값": "{ (", + "서식": 1 + }, + "D9": { + "값": 2, + "서식": 2 + }, + "E9": { + "값": "+", + "서식": 3 + }, + "F9": { + "값": 4.2, + "서식": 2 + }, + "G9": { + "값": ")", + "서식": 3 + }, + "H9": { + "값": "÷", + "서식": 4 + }, + "I9": { + "값": 2, + "서식": 5 + }, + "J9": { + "값": "}", + "서식": 3 + }, + "K9": { + "값": " × ", + "서식": 6 + }, + "L9": { + "값": 2.2, + "서식": 7 + }, + "N9": { + "값": "×", + "서식": 2 + }, + "O9": { + "값": 1, + "서식": 4 + }, + "P9": { + "값": "×", + "서식": 3 + }, + "Q9": { + "값": "100%", + "서식": 8 + }, + "S9": { + "값": " ", + "서식": 9 + }, + "T9": { + "값": " ", + "서식": 9 + }, + "U9": { + "값": " =", + "서식": 3 + }, + "V9": { + "값": 6.82, + "서식": 10 + }, + "W9": { + "값": "㎥", + "서식": 3 + }, + "C10": { + "값": "{ (", + "서식": 1 + }, + "D10": { + "값": 2, + "서식": 2 + }, + "E10": { + "값": "+", + "서식": 3 + }, + "F10": { + "값": 4.2, + "서식": 2 + }, + "G10": { + "값": ")", + "서식": 3 + }, + "H10": { + "값": "÷", + "서식": 4 + }, + "I10": { + "값": 2, + "서식": 5 + }, + "J10": { + "값": "}", + "서식": 3 + }, + "K10": { + "값": " × ", + "서식": 6 + }, + "L10": { + "값": 2.2, + "서식": 7 + }, + "N10": { + "값": "×", + "서식": 2 + }, + "O10": { + "값": 1, + "서식": 4 + }, + "P10": { + "값": "×", + "서식": 3 + }, + "Q10": { + "값": "0%", + "서식": 8 + }, + "S10": { + "값": " ", + "서식": 9 + }, + "T10": { + "값": " ", + "서식": 9 + }, + "U10": { + "값": " =", + "서식": 3 + }, + "V10": { + "값": 0, + "서식": 10 + }, + "W10": { + "값": "㎥", + "서식": 3 + }, + "C11": { + "값": "[ { (", + "서식": 11 + }, + "D11": { + "값": 2, + "서식": 12 + }, + "E11": { + "값": "+", + "서식": 13 + }, + "F11": { + "값": 3.7, + "서식": 12 + }, + "G11": { + "값": ")", + "서식": 13 + }, + "H11": { + "값": "÷", + "서식": 13 + }, + "I11": { + "값": 2, + "서식": 13 + }, + "J11": { + "값": " × ", + "서식": 14 + }, + "K11": { + "값": 1.7, + "서식": 15 + }, + "L11": { + "값": "} - {", + "서식": 16 + }, + "M11": { + "값": 3.14, + "서식": 17 + }, + "N11": { + "값": "×", + "서식": 16 + }, + "O11": { + "값": 0.6, + "서식": 18 + }, + "P11": { + "값": "²} ", + "서식": 19 + }, + "Q11": { + "값": "]", + "서식": 20 + }, + "R11": { + "값": "×", + "서식": 13 + }, + "S11": { + "값": 1, + "서식": 16 + }, + "T11": { + "값": " ", + "서식": 21 + }, + "U11": { + "값": " =", + "서식": 13 + }, + "V11": { + "값": 3.71, + "서식": 22 + }, + "W11": { + "값": "㎥", + "서식": 13 + }, + "C12": { + "값": "{ (", + "서식": 23 + }, + "D12": { + "값": 3.7, + "서식": 24 + }, + "E12": { + "값": "+", + "서식": 25 + }, + "F12": { + "값": 4.2, + "서식": 24 + }, + "G12": { + "값": ")", + "서식": 25 + }, + "H12": { + "값": "÷", + "서식": 26 + }, + "I12": { + "값": 2, + "서식": 27 + }, + "J12": { + "값": "}", + "서식": 25 + }, + "K12": { + "값": " × ", + "서식": 28 + }, + "L12": { + "값": 0.5, + "서식": 17 + }, + "N12": { + "값": "×", + "서식": 24 + }, + "O12": { + "값": 1, + "서식": 26 + }, + "P12": { + "값": " ", + "서식": 29 + }, + "Q12": { + "값": " ", + "서식": 29 + }, + "R12": { + "값": " ", + "서식": 26 + }, + "S12": { + "값": " ", + "서식": 29 + }, + "T12": { + "값": " ", + "서식": 29 + }, + "U12": { + "값": " =", + "서식": 25 + }, + "V12": { + "값": 1.97, + "서식": 30 + }, + "W12": { + "값": "㎥", + "서식": 25 + }, + "C17": { + "값": " 1.터파기", + "서식": 31 + }, + "D17": { + "값": "토사(100%)", + "서식": 32 + }, + "E17": { + "값": "{ (", + "서식": 3 + }, + "F17": { + "식": "K22/1000", + "서식": 2 + }, + "G17": { + "값": "+", + "서식": 3 + }, + "H17": { + "식": "K5/1000", + "서식": 2 + }, + "I17": { + "값": ")", + "서식": 3 + }, + "J17": { + "값": "÷", + "서식": 4 + }, + "K17": { + "값": 2, + "서식": 5 + }, + "L17": { + "값": "}", + "서식": 3 + }, + "M17": { + "값": "×", + "서식": 6 + }, + "N17": { + "식": "R15/1000", + "서식": 7 + }, + "P17": { + "값": "×", + "서식": 2 + }, + "Q17": { + "값": 1, + "서식": 4 + }, + "R17": { + "값": "×", + "서식": 3 + }, + "S17": { + "값": 1, + "서식": 8 + }, + "U17": { + "값": " ", + "서식": 9 + }, + "V17": { + "값": " ", + "서식": 9 + }, + "W17": { + "값": " =", + "서식": 3 + }, + "X17": { + "식": "ROUNDDOWN((D26+F26)/2*L26*Q26,2)", + "서식": 10 + }, + "Y17": { + "값": "㎥", + "서식": 3 + }, + "Z17": { + "값": " ", + "서식": 33 + }, + "D18": { + "값": "암(0%)", + "서식": 32 + }, + "E18": { + "값": "{ (", + "서식": 3 + }, + "F18": { + "식": "D26", + "서식": 2 + }, + "G18": { + "값": "+", + "서식": 3 + }, + "H18": { + "식": "F26", + "서식": 2 + }, + "I18": { + "값": ")", + "서식": 3 + }, + "J18": { + "값": "÷", + "서식": 4 + }, + "K18": { + "값": 2, + "서식": 5 + }, + "L18": { + "값": "}", + "서식": 3 + }, + "M18": { + "값": "×", + "서식": 6 + }, + "N18": { + "식": "L26", + "서식": 7 + }, + "P18": { + "값": "×", + "서식": 2 + }, + "Q18": { + "값": 1, + "서식": 4 + }, + "R18": { + "값": "×", + "서식": 3 + }, + "S18": { + "값": 0, + "서식": 8 + }, + "U18": { + "값": " ", + "서식": 9 + }, + "V18": { + "값": " ", + "서식": 9 + }, + "W18": { + "값": " =", + "서식": 3 + }, + "X18": { + "식": "ROUNDDOWN((D27+F27)/2*L27*Q27,2)", + "서식": 10 + }, + "Y18": { + "값": "㎥", + "서식": 3 + }, + "Z18": { + "값": " ", + "서식": 33 + }, + "C19": { + "값": "2.되메우기", + "서식": 34 + }, + "D19": { + "값": "일반토사", + "서식": 35 + }, + "E19": { + "값": "[ { (", + "서식": 13 + }, + "F19": { + "식": "D26", + "서식": 12 + }, + "G19": { + "값": "+", + "서식": 13 + }, + "H19": { + "식": "K7/1000", + "서식": 12 + }, + "I19": { + "값": ")", + "서식": 13 + }, + "J19": { + "값": "÷", + "서식": 13 + }, + "K19": { + "값": 2, + "서식": 13 + }, + "L19": { + "값": "×", + "서식": 14 + }, + "M19": { + "식": "D16/1000", + "서식": 15 + }, + "N19": { + "값": "} - {", + "서식": 16 + }, + "O19": { + "값": 3.14, + "서식": 17 + }, + "P19": { + "값": "×", + "서식": 16 + }, + "Q19": { + "식": "K20/2000", + "서식": 18 + }, + "R19": { + "값": "²} ", + "서식": 19 + }, + "S19": { + "값": "]", + "서식": 20 + }, + "T19": { + "값": "×", + "서식": 13 + }, + "U19": { + "값": 1, + "서식": 16 + }, + "V19": { + "값": " ", + "서식": 21 + }, + "W19": { + "값": " =", + "서식": 13 + }, + "X19": { + "식": "ROUNDDOWN(((D28+F28)/2*K28-(3.14*O28*O28))*1,2)", + "서식": 22 + }, + "Y19": { + "값": "㎥", + "서식": 13 + }, + "Z19": { + "값": " ", + "서식": 36 + }, + "E20": { + "값": "{ (", + "서식": 25 + }, + "F20": { + "식": "K7/1000", + "서식": 24 + }, + "G20": { + "값": "+", + "서식": 25 + }, + "H20": { + "식": "F26", + "서식": 24 + }, + "I20": { + "값": ")", + "서식": 25 + }, + "J20": { + "값": "÷", + "서식": 26 + }, + "K20": { + "값": 2, + "서식": 27 + }, + "L20": { + "값": "}", + "서식": 25 + }, + "M20": { + "값": "×", + "서식": 28 + }, + "N20": { + "식": "D13/1000", + "서식": 17 + }, + "P20": { + "값": "×", + "서식": 24 + }, + "Q20": { + "값": 1, + "서식": 26 + }, + "R20": { + "값": " ", + "서식": 29 + }, + "S20": { + "값": " ", + "서식": 29 + }, + "T20": { + "값": " ", + "서식": 26 + }, + "U20": { + "값": " ", + "서식": 29 + }, + "V20": { + "값": " ", + "서식": 29 + }, + "W20": { + "값": " =", + "서식": 25 + }, + "X20": { + "식": "ROUNDDOWN((D29+F29)/2*L29,2)", + "서식": 30 + }, + "Y20": { + "값": "㎥", + "서식": 25 + }, + "Z20": { + "값": " ", + "서식": 37 + }, + "E21": { + "값": "계 : ", + "서식": 38 + }, + "W21": { + "값": " =", + "서식": 25 + }, + "X21": { + "식": "V28+V29", + "서식": 30 + }, + "Y21": { + "값": "㎥", + "서식": 25 + }, + "Z21": { + "값": " ", + "서식": 44 + }, + "C22": { + "값": " 4.잔 토", + "서식": 45 + }, + "D22": { + "값": " ", + "서식": 46 + }, + "E22": { + "값": " ", + "서식": 47 + }, + "F22": { + "값": "1식", + "서식": 48 + }, + "G22": { + "값": " -", + "서식": 49 + }, + "H22": { + "값": "3식", + "서식": 48 + }, + "I22": { + "값": " ", + "서식": 49 + }, + "J22": { + "값": " ", + "서식": 48 + }, + "L22": { + "값": " ", + "서식": 49 + }, + "M22": { + "값": " ", + "서식": 49 + }, + "N22": { + "값": " ", + "서식": 49 + }, + "O22": { + "값": " ", + "서식": 49 + }, + "P22": { + "값": " ", + "서식": 49 + }, + "Q22": { + "값": " ", + "서식": 49 + }, + "R22": { + "값": " ", + "서식": 49 + }, + "S22": { + "값": " ", + "서식": 47 + }, + "T22": { + "값": " ", + "서식": 47 + }, + "U22": { + "값": " ", + "서식": 47 + }, + "V22": { + "값": " ", + "서식": 47 + }, + "W22": { + "값": " =", + "서식": 50 + }, + "X22": { + "식": "(V26+V27)-V29", + "서식": 51 + }, + "Y22": { + "값": "㎥", + "서식": 50 + }, + "Z22": { + "값": " ", + "서식": 52 + }, + "F21": { + "서식": 39 + }, + "G21": { + "서식": 38 + }, + "H21": { + "서식": 39 + }, + "I21": { + "서식": 38 + }, + "J21": { + "서식": 40 + }, + "K21": { + "서식": 41 + }, + "L21": { + "서식": 38 + }, + "M21": { + "서식": 42 + }, + "N21": { + "서식": 43 + }, + "O21": { + "서식": 43 + }, + "P21": { + "서식": 39 + }, + "Q21": { + "서식": 40 + }, + "T21": { + "서식": 40 + } + }, + "병합": [ + "L12:M12", + "Q10:R10", + "L10:M10", + "Q9:R9", + "L9:M9", + "C17:C18", + "N17:O17", + "S17:T17", + "N18:O18", + "S18:T18", + "C19:C21", + "D19:D21", + "N20:O20", + "J22:K22" + ] } ], "활성": "s1", - "재료번": "SM01010100" + "재료번": "SM01010100", + "계산값": { + "s1": { + "F17": { + "수": "0" + }, + "H17": { + "수": "0" + }, + "N17": { + "수": "0" + }, + "X17": { + "수": "0" + }, + "F18": { + "수": "0" + }, + "H18": { + "수": "0" + }, + "N18": { + "수": "0" + }, + "X18": { + "수": "0" + }, + "F19": { + "수": "0" + }, + "H19": { + "수": "0" + }, + "M19": { + "수": "0" + }, + "Q19": { + "수": "0.001" + }, + "X19": { + "수": "0" + }, + "F20": { + "수": "0" + }, + "H20": { + "수": "0" + }, + "N20": { + "수": "0" + }, + "X20": { + "수": "0" + }, + "X21": { + "수": "0" + }, + "X22": { + "수": "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( "음수 회계형",