knowledge(요구): 분석 588-2 — 원화 표기 · 품셈 1-2-2 금액 단위표준 · 꼴 함수 한 벌

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015uTVHFZkNcUa1SR4cNcENM
This commit is contained in:
2026-11-02 22:14:11 +09:00
co-authored by Claude Opus 5.5
parent e5fd227592
commit bc34df27ec
@@ -0,0 +1,215 @@
# 588-2 원화 표기 조사 — 소수점 · 콤마 · 끝수
조사 = 코드 전수 grep + 랩탑 메인 5173 ORCA 화면 실측(보기만 · 개인 층 「테스트1」 SK-000002 · 서고 목록 · B09 `검증_랩탑메인`) + 지식DB · 실무 xlsx 3건 표시 꼴(`number_format`) 읽기.
측정 자료 = 이 폴더(`text_sk2_*.txt` 보기 넷 · `b09_*.txt` B09 탭 · `sk2_answer.json` 셈 답 · `xlsx_formats.py` · `xlsx_cols.py`).
## 0. 요약
- 한 SK(테스트1)가 화면마다 다른 금액 — 단가산출 상세 `124,420` · 서고 목록 `124,419.85` · B09 재료 창고 `124,420원` · B09 산근 셈 규칙대로면 `124,419`.
- 뿌리 둘 — ① M01 · M02 셈은 끝수(버림)가 없고 화면이 반올림만 함, B09 는 엑셀대로 버림 ② 꼴 함수가 한 벌 없이 자리마다 `toLocaleString` · `decimals` 를 따로 정함.
- 바로 보이는 흠 — 일위대가표 격자 단가 · 합계 `.0` 꼬리(`275,790.0` · `합 계 281,354.0` · `0.0`) · 재료 줄 합 ≠ 재료 소계(`11,695 + 23,426 + 1,405 = 36,526` 대 `36,525`) · 식 안 금액 소수 셋(`(11,694.62 + 23,425.632) × 4 %`) · 율 글자 `4.0 %` · 중간 값 `경비 870.2455` · 환율표 `59,020.00`.
- 근거 — 산림 · 건설 품셈 1-2-2 「금액의 단위표준」(일위대가 금액란 0.1원 · 계금 · 설계서 금액 1원 · 총액 1,000원, 모두 미만버림) · 실무 xlsx 3건 표시 꼴 같음.
- 일감 넷 — 꼴 고침(셈 안 바뀜 · 바로) · 공용 꼴 한 벌 + 거울 시험 · M01·M02 셈 끝수(사용자 답 뒤) · 수량 반올림(나중).
## A. 숫자 → 글 자리
### A-1. 공용 꼴 함수(있는 것)
| 함수 | 자리 | 꼴 | 쓰는 곳 |
|---|---|---|---|
| `formatNumber` | `M01_MasterData/M01_MasterData_UI_Logic_Edit.ts:56-60` | 콤마 · 소수 최대 4 · 반올림 · 객체 = JSON 글 | M01 상세 · 시험 계산 · 모달 · 찾기 표 (호출 22) |
| `formatMoney` | `M01_MasterData/M01_MasterData_UI_Logic_Money.ts:8-11` | 콤마 · 정수 · 반올림 | M01 · M02 단가산출 상세 · 일위대가 줄 표 (호출 18 · 가져오는 파일 11) |
| `formatPrice` | `M01_MasterData_UI_Logic_Money.ts:14-19` | 200원 미만 = 유효숫자 넷 · 그 밖 = 정수 반올림 | 상세 단가 칸 · 모달 (호출 9) |
| `fmt` · `fmt_money` · `fmt_price`(파이썬) | `resources/master_data/scripts/master_text.py:36-61` | 위 셋의 짝(머리에 짝 표시 없음 · 거울 시험 없음) | 텍스트 수식 · 계산서 줄 글 · B09 산근 글 |
| `formatCell` + 열 `decimals` · `trim` | `ui_template/ui_template_data_table.ts:134-143 · 333-340` | Intl · `trim` 없으면 소수 자리 늘 채움 | 모든 데이터표 · 일위대가표 격자 |
| 격자 열 | `ui_template/ui_template_hopyo_grid.ts:101-115` | 단가 · 금액 `decimals: 1`(trim 없음) · 수량 4(trim) | M02 일위대가 · B09 일위대가표 |
| 계산서 `won` · `out` | `A00_Common/calc_sheet.ts:148-152` | 콤마 · 최대 n 자리 · 끝 0 뗌 | M01 · M02 인력·재료·경비 · B09 단가산출근거 |
| B09 열 `money` · `qty` | `B09_Estimation/B09_Estimation_UI_Tabs.ts:176-192` | money = 자리 고정(trim 없음) · qty = trim | B09 모든 탭 |
| 흐름 로직 끝수 `roundBy` · `showRounded` | `M02_MasterTemplete/DataFlow/M02_DF_Round.ts:72-112` | 품셈 1-2-2 표를 읽어 버림 · 그 자리 보임 | DataFlow 실험(「이 폴더째 지워도 됨」) |
거울 어긋남(같은 값 · TS 대 파이썬, `node` · `venv` 실측):
| 값 | TS `formatNumber` | 파이썬 `fmt` | 까닭 |
|---|---|---|---|
| 1.00005 | 1.0001 | 1 | 파이썬 `quantize` 기본 = 은행가 반올림(`master_text.py:43`) |
| 0.12345 | 0.1235 | 0.1234 | 같음 |
| 0.00167 | 0.0017 | 0.00167 | 파이썬만 유효숫자 넷 규칙(`master_text.py:40`) |
### A-2. 공용 함수를 안 쓰고 직접 꼴을 정한 자리 — 수
| 폴더 | `toLocaleString` | `toFixed` | `Intl.NumberFormat` | `format*` 호출 | 표 `kind:"number"` |
|---|---|---|---|---|---|
| M01_MasterData | 7 | 0 | 0 | 32 | 0 |
| M02_MasterTemplete | 23 | 11 | 1 | 10 | 9 |
| B09_Estimation | 11 | 1 | 1 | 0 | 9 |
| ui_template | 4 | 18 | 4 | 0 | 3 |
| A00_Common | 3 | 38 | 0 | 4 | 16 |
`toFixed` 대부분 = 좌표 · 측점 · 그림(돈 아님 · B05 125 · B06 156 등 제외). 돈 · 단가 · 수량 자리 = M01 · M02 · B09 · ui_template · calc_sheet 안에 모임. B10 결제는 꼴 코드 없음.
돈 · 수량을 직접 꼴로 만든 자리(돈 관련만):
| 자리 | 꼴 | 무엇 |
|---|---|---|
| `M02_MasterTemplete_Library_List.ts:66-67` | 최대 소수 2 | 서고 목록 「기준 금액」 |
| `M02_MasterTemplete_Labor_Rows.ts:80-81` | 최대 소수 6 | 일위대가 줄 수량 |
| `M02_MasterTemplete_Labor_Rows.ts:160-161` | `formatMoney` | 일위대가 줄 금액 칸(정수) |
| `M02_MasterTemplete_ItemList.ts:57` · `Structure.ts:79` | 정수 반올림 | 구조물 조합 일위대가 금액 |
| `M02_MasterTemplete_Hopyo_Check.ts:165` | `String(Math.round(v*1e4)/1e4)` 콤마 없음 | 마법사 품 비교 |
| `Hopyo_Check.ts:203-204` · `Hopyo_Sheet.ts:88-89` | 인자 없는 `toLocaleString`(최대 소수 3) | 마법사 엑셀 · 우리 금액 |
| `Hopyo_Check.ts:470` | `String(x.수량)` 콤마 없음 · 부동소수 꼬리 그대로 | 마법사 빠진 줄 표 |
| `Hopyo_CheckRows.ts:64-65 · 250-251` | 수량 6 · 가격 인자 없음(3) | 마법사 줄 |
| `Hopyo_Choose.ts:37 · 55` · `Hopyo_Ledger.ts:111` | `String()` 콤마 없음 | 마법사 고르기 · 별칭 장부 입력값 |
| `Hopyo_Relink.ts:41 · 155-159` | 정수 · 표 `decimals:1`(trim 없음 → `.0`) | 다시 잇기 표 |
| `Labor_Paste.ts:44 · 170-172` | 정수 · 차이 `decimals:1` | 붙여넣기 대조 |
| `Find_Pick.ts:178` · `Labor_Pick.ts:157` | 표 0자리 반올림 | 찾아 넣기 창 금액(22.9원 → 23) |
| `M01_MasterData_UI_Logic_Calc.ts:304-308` | 돈이고 1,000 이상만 `formatMoney`, 아니면 4자리 | 시험 계산 중간 값 |
| `M01_MasterData_UI_Logic_Edit.ts:278 · 285 · 349` | `formatNumber`(4자리) | 기초 편집 단가 · 금액 칸 |
| `M01_MasterData_UI_LogicLab_FlowRows.ts:66 · 111` | 최대 소수 6 | 흐름 로직 줄 |
| `B09_Estimation_UI_Store.ts:136 · 164` | 정수 반올림 + 「원」 붙임 | 재료 창고 단가산출 · 일위대가 금액 |
| `B09_Estimation_UI_Import.ts:47` | 인자 없음 · 빈 값 → `0` | 엑셀 불러오기 대조 글 |
| `B09_Estimation_UI_Import.ts:361` · `UI_Tabs_Total.ts:34` | `en-US` 정수 | 불러오기 · 원가계산서 손입력 |
| `B09_Estimation_UI_Tabs_Base.ts:124` | 인자 없음 | 자재단가대비 고르기 메뉴 |
| `B09_Estimation_UI_Tabs_Bill_Fold.ts:61` · `Sangeun_Sheet.ts:53` | 최대 4 | 펼침 · 산근 고침 칸 |
| `ui_template/ui_template_group_cards.ts:84` | 최대 1 | 묶음 카드 비목 풍선 |
| `ui_template/ui_template_item_picker.ts:216` · `_detail.ts:242` | 정수 · 인자 없음 | 구조물 고르기 창 |
### A-3. 서버(파이썬)가 글로 만들어 보내는 자리
| 자리 | 꼴 | 화면 |
|---|---|---|
| `master_text.py:447` | `fmt_price(단가) * 수량 = fmt_money(금액)` | 텍스트 수식 · 계산서 식 칸 |
| `master_text.py:159-163` `_value` | 계산된 값 = `fmt`(수량 꼴) — `줄.'합판'` 금액 참조도 | 식 안 금액 소수 셋 |
| `M01_MasterData_Router.py:253` `_pct` | `_num` 뒤 Decimal `율` 을 다시 넣음 → JSON 글자 `"4.0"` | 시험 계산 `4.0 %` |
| `M01_MasterData_Store_Flow.py:268` | Decimal = `f"{v:,}"` 전체 자리 · float = `str` 콤마 없음 | 흐름 로직 텍스트 수식 |
| `B09_Estimation_Sangeun_Text.py:44 · 407-409` | 줄 `,.1f`(늘 1자리) · 계 `,.0f` | B09 산근 텍스트 수식 |
| `M02_Hopyo_Verdict.py:24` · `M02_Hopyo_SkPatch.py:230 · 237` | `.4g` · `.6g`(1만 넘으면 지수 꼴) | 마법사 품 비교 꼬리표 |
| `B09_Estimation_Import_Rates.py:198 · 224` | `,.0f 원` | 불러오기 알림 |
## B. 실제로 틀린 꼴
### B-1. 한 SK 「테스트1」(GC000211 합판거푸집) — 화면 실측
셈 답(서버 `POST /api/m02/layers/personal/sangeun/calc`) = 노무비 87,024.545 · 재료비 36,525.062 · 경비 870.245 · 계 124,419.853.
| 보기 | 형틀목공 금액 | 인력 소계 | 재료 줄 셋 | 계 | 꼴 자리 |
|---|---|---|---|---|---|
| 단가산출 상세 | 69,644 | 87,025 | 11,695 · 23,426 · 1,405 → **합 36,526 ≠ 소계 36,525** | 124,420 | `LogicLab_Ho.ts:418 · 629 · 669 · 690` |
| 인력·재료·경비 | 69,643.9 | 87,024.5 → 맨 아래 87,025 | 11,694.6 · 23,425.6 · 1,404.8 = 36,525.1 | 124,420 | `calc_sheet.ts:155 · 282`(1자리) · `271 · 292`(0자리) |
| 시험 계산 | 69,644 | 87,025 | 11,695 · 23,426 · 1,405 | 124,420 · 중간 값 **경비 870.2455** · 율 **4.0 %** | `Logic_Calc.ts:250-251 · 304-308` · `M01_MasterData_Router.py:253` |
| 텍스트 수식 | `= 69,644` | 87,025 | `소모자재 : (11,694.62 + 23,425.632) * 4 % = 1,405` | 124,420 | `master_text.py:159-163 · 447` |
| 서고 목록(개인 단가산출) | — | — | — | **124,419.85** | `Library_List.ts:66-67` |
| 서고 목록(마스터 일위대가 SC-000001) | — | — | — | **272,935.33** | 같음 |
| B09 재료 창고 | — | — | — | 124,420원 | `B09_Estimation_UI_Store.ts:136` |
| B09 산근 셈(같은 SK · 규칙 계산) | 69,643.9 | 87,024 | 11,694.6 · 23,425.6 · 1,404.8 | **124,419** | `B09_Estimation_Sangeun_Text.py:17` 규칙 |
식 검산 안 맞음 — `275,790 × 0.2525 = 69,644`(계산기 69,636.98) · 수량 셈 값 = 0.252525…(25/99), 보이는 값 = 넷째 자리.
### B-2. 꼴 흠 표
| # | 자리 | 보이는 예(실측) | 바른 꼴 | 근거 |
|---|---|---|---|---|
| 1 | 일위대가표 격자 단가 칸 `hopyo_grid.ts:101-108` · B09 `UI_Tabs_Base.ts:381-384` | `275,790.0` · `70,081.0` · `0.0` | `275,790` · `70,081`(소수 있으면 그 자리까지) | 실무 일위대가표 단가 `#,##0.###` |
| 2 | 같은 격자 합계 줄 · 머리 1단위 합계 | `합 계 281,354.0` · M02 `0.0` | `281,354` | 품셈 1-2-2 계금 1원 · 실무 `#,##0` |
| 3 | 같은 격자 금액 칸 | `109,326.3`(맞음) · `18,064.0` | `18,064` | 실무 `#,##0.#`(끝 0 없음) |
| 4 | B09 `Bill_Fold.ts:150-153` · `Sangeun_Sheet.ts:177-180` · `Tabs_Sangeun.ts:154-157` · M02 `Hopyo_Relink.ts:155-159` · `Labor_Paste.ts:172` | `decimals:1` trim 없음 → `X.0` | 끝 0 뗌 | 1 · 3 과 같음 |
| 5 | B09 환율및기초자료 값 열 `UI_Tabs_Base.ts:104` | 운전사 시간 노임 `59,020.00` | `59,020`(환율만 `1,414.9`) | 셈 = ROUNDDOWN 0 |
| 6 | 단가산출 상세 금액 0자리 반올림 `LogicLab_Ho.ts:418` | 재료 줄 합 36,526 ≠ 소계 36,525 | 줄 = 0.1원(`11,694.6`) · 소계 · 계 = 정수 | 품셈 금액란 0.1원 · 실무 단가산출근거 `#,##0.0#` |
| 7 | 반올림 대 버림 — `formatMoney` · `fmt_money` · Intl 모두 반올림 | 계 `124,420` | `124,419` | 품셈 1-2-2 「미만버림」 · B09 ROUNDDOWN |
| 8 | 같은 금액 보기마다 다른 자리 | 69,644 / 69,643.9 · 87,025 / 87,024.5 | 한 꼴 | — |
| 9 | 서고 목록 기준 금액 `Library_List.ts:66-67` | `124,419.85` · `272,935.33` | `124,419` | 계금 1원 |
| 10 | 식 안 금액 참조 `master_text.py:159-163` | `(11,694.62 + 23,425.632) × 4 %` | `(11,694.6 + 23,425.6) × 4 %` | 금액란 0.1원 |
| 11 | 율 글자 `M01_MasterData_Router.py:253` | 시험 계산 `소모자재 4.0 %` | `4 %` | Decimal 이 `_num` 을 안 거침 |
| 12 | 시험 계산 중간 값 `Logic_Calc.ts:304-308` | `경비 870.2455` · `공구손료 및 경장비 870.2455` 옆 `노무비 87,025` | 돈은 모두 돈 꼴 | 1,000 문턱 판정 |
| 13 | 기초 편집 단가 · 금액 `Logic_Edit.ts:278 · 285 · 349` | `formatNumber` → `69,643.9394` 꼴 | 상세와 같은 돈 꼴 | — |
| 14 | 단가 소수 숨김 — `formatPrice`(200원 이상 정수) · B09 재료 단가 0자리 `UI_Tabs_Base.ts:199-203 · 297` · 찾아 넣기 금액 0자리 | 경유 `1,846`(셈 1,846.39) · 철선 `23`(22.9) · 산근 단가 `26,461`(셈 26,460.9) | `1,846.39` · `22.9` | 보이는 단가 = 셈 단가 · 실무 단가 `#,##0.###` |
| 15 | 콤마 없음 `Hopyo_Check.ts:165 · 470` · `Hopyo_Choose.ts:37 · 55` · `Hopyo_Ledger.ts:111` · `Store_Flow.py:268`(float) | `1234.5` · 부동소수 꼬리 | `1,234.5` | — |
| 16 | 소수 셋 기본(인자 없는 `toLocaleString`) `Hopyo_Check.ts:204` · `Hopyo_CheckRows.ts:251` · `Hopyo_Sheet.ts:89` · `B09_UI_Import.ts:47` · `UI_Tabs_Base.ts:124` | `1,846.39` 옆 `26,460.939` | 꼴 이름대로 | — |
| 17 | 빈 값 → 0 `B09_UI_Import.ts:47` (`Number(v \|\| 0)`) | 모름이 `0` | 빈칸 | B09 빈칸 규칙 |
| 18 | 0 · 빈 값 글 섞임 | `—` · `-` · `빈칸` · `…` · `0.0` | 모름 = 페이지 말(M = `—` · B09 = `빈칸`) · 0 = `0` · `0.0` 없음 | 실무 xlsx = 0 빈칸(인쇄 몫) |
| 19 | 「원」 붙임 섞임 `B09_UI_Store.ts:136 · 164`(붙임) 대 `B09_UI_Import.ts:130 · 203` · `Labor_Diagram.ts:183`(띄움) | `124,420원` / `1,234 원` | 표 칸 = 안 붙임(머리에 「원」) · 문장 = 한 꼴 | — |
| 20 | 수량 자리 들쭉날쭉 — 상세 4 · 줄 표 6(`Labor_Rows.ts:81`) · 격자 4 · B09 2·3·4 | `0.2525` / `0.252525` · 설계내역 `4,584.432 ㎥` | 수량 4(trim) · 내역 수량 단위표준 | 품셈 1-2-1 · 1-2-2 표 · 실무 내역 `#,##0.####` |
| 21 | 마법사 품 꼬리표 `M02_Hopyo_Verdict.py:24` `.4g` | 1만 넘으면 `1.235e+05` | `formatNumber` 꼴 | — |
| 22 | `en-US` · 인자 없는 locale 혼용(`UI_Tabs_Total.ts:34` · `UI_Import.ts:361` · `item_picker_detail.ts:242` · `Tabs_Base_Quote.ts:57`) | 보이는 꼴은 같음 | `ko-KR` 한 벌 | 낮은 순위 |
음수 = Intl `-1,234` · 실무 `\-#,##0` 같음(흠 없음).
## C. 근거
### C-1. 원문(품셈)
| 근거 | 원문 | 뜻 |
|---|---|---|
| 산림품셈 1-2-2 2 `resources/knowledge/original/원가계산/산림_표준품셈/본문/제01장_적용기준/1-02_설계_및_수량.md:141-149` · 건설품셈 같은 표 `…/건설공사_표준품셈/본문/01_공통부문/제01장_적용기준/1-02_설계_및_수량.md:127-135` | 설계서 총액 1,000 · 소계 1 · 금액란 1 · 일위대가표 계금 1 · 일위대가표 금액란 0.1 — 모두 「미만버림」 | 금액 = 원 미만 버림 · 일위대가 줄 금액 = 0.1원 미만 버림 |
| 건설품셈 같은 파일 `:139` | 소액이라 공종이 없어질 우려 → 소수자리 조정 | 0.1원 아래 예외 |
| 건설품셈 같은 파일 `:20-23` | 수량 = 지정 소수자리 아래 1자리까지 산출해 반올림 · 곱 · 나눗셈은 적힌 차례 | 수량 반올림 |
| 산림품셈 같은 파일 `:21` | 인원 계산 = 셋째 자리에서 반올림 · 둘째 자리 표시 | 품(인) 소수 2 |
| 산림품셈 같은 파일 `:55-139` 「설계서의 단위 및 소수의 표준」 | 종목별 단위수량 소수자리(토적 체적 ㎥ 2 · 콘크리트 ㎥ 2 · 철강재 kg 3 …) · [주] ① 반올림 ② 항목 자리 우선 | 수량 자리 표 |
| 건설품셈 8-1 `…/제08장_건설기계/8-01_적용기준.md:163` | 시간당 손료 원 미만 절사 | 기계 손료 |
| 단가 · 율 · 부가세 끝수 원문 | 없음 | — |
### C-2. 실무(STmate 생성 xlsx · 기번3 공통 · 봉화 · 영월 세 건 같음 · `xlsx_cols.py` 실측)
| 시트 · 칸 | 표시 꼴 | 뜻 |
|---|---|---|
| 일위대가표 금액(F·H·J·L) | `#,##0.#;\-#,##0.#;#` | 최대 1자리 · 끝 0 없음 · 0 = 빈칸 |
| 일위대가표 단가(E·G·I·K) | `#,##0.###` ~ `#,##0.#######` | 소수 있으면 그대로 · 끝 0 없음 |
| 일위대가표 수량(C) | `0.#######` | 최대 7 |
| 일위대가표 합계 줄 · 일위대가목록표 · 단가산출근거목록표 · 중기목록표 | `#,##0;\-#,##0;#` | 정수 · 0 = 빈칸 |
| 단가산출근거 줄 금액(C~F) | `#,##0.0#` | 늘 1자리(`3,899.0`) · 최대 2 |
| 설계내역서 수량 · 단가 · 금액 | `#,##0.####` · `#,##0.######` · `#,##0` | 수량 4 · 단가 그대로 · 금액 정수 |
| 노무 · 재료 · 경비 목록표 단가 · 집계표 단가 | `#,##0.00#` | 늘 2자리(`268,058.00`) |
| 원가계산서 율 | `0.000 "%"` | 율 3자리 |
실무 끝수(지식DB `resources/knowledge/technical_info/01_임도/05_원가정보/단수처리_규칙.md:26-30` · STmate `…/STmate 분석/20_분석/17_단가조립_검증.md:17-22 · 46-49` · EST Plus `…/EST Plus 2/REA 분석/ESTPlus2_REA_최종보고서_20261030.md:68 · 108-118`) — 내역 행 · 제경비 ROUNDDOWN 0 · 호표 성분 소계 절사 · 산근 성분 줄 1자리 절사 · 마지막 합계 원 미만 절사 · 집계표만 반올림.
지식DB 어긋남 — `단수처리_규칙.md:63-68` 「원단위 절사 원문 미확보」 = 품셈 1-2-2 가 원문(지식DB 고칠 거리 · 이 일감 밖).
### C-3. 지금 코드 끝수
| 길 | 줄 금액 | 비목 소계 · 계 | 보임 |
|---|---|---|---|
| B09 일위대가 · 산근 · 중기 `B09_Estimation_Calc_Labor.py:16-18` · `Calc_Base.py:23` · `Sangeun_Text.py:17` | ROUNDDOWN 1 | ROUNDDOWN 0 · 계 = 비목 합 | 원문 · 실무와 같음 |
| B09 내역 · 원가 `Calc_Total.py:18` · `Summary.py:14` | ROUNDDOWN 0(집계만 ROUND) | 관급 ROUNDUP −3 | 실무 그대로 |
| M01 엔진 `master_formula.py:490-502` `cut` | 로직 `끝수` 묶음 있을 때만 | 1,461 줄 중 묶음 0 · 글자 설명 31 · 나머지 null | 끝수 없음 |
| M02 단가산출 · 일위대가 `M02_Sangeun_Calc.py` · `M02_Labor_Doc.py` settle ↔ `Labor_Calc.ts` | 없음 | 없음 | 화면 반올림만 |
| M02 DataFlow `M02_DF_Round.ts:60-70` | 기본 0.1원 버림 | 기본 1원 버림 | 품셈 표 읽음(실험 길) |
## D. 규칙 안 · 공용 꼴 · 일감
### D-1. 규칙 안(셈 값과 보이는 값 분리)
- 셈 값 = 정본 그대로(꼴이 값을 바꾸지 않음). 끝수(버림)는 셈 몫 — 화면 꼴은 정본 자리 그대로 보임.
- 금액(계금 · 소계 · 계 · 설계서 금액 · 목록표 합계) = 콤마 · 정수 · 원 미만 버림(정본이 이미 버림).
- 줄 금액(일위대가표 금액란 · 산근 줄 · 계산서 줄) = 콤마 · 최대 1자리 · 0.1원 미만 버림 · 끝 0 = 일위대가표 뗌 · 산근 근거 글 붙임(`3,899.0`, 실무 그대로 · 시험 `test_155_5_sangeun_text.py:58` 이 이 꼴을 지킴).
- 단가 = 콤마 · 셈 단가 그대로(최대 소수 3 · 끝 0 뗌) · 200원 미만 유효숫자 넷(지금 `formatPrice` 규칙 유지) · 정수로 반올림해 숨기지 않음.
- 수량 · 품 = 콤마 · 최대 4 · 유효숫자 넷(파이썬 `fmt` 규칙) · 끝 0 뗌 · 반올림.
- 율 = 수 그대로 + ` %` · 글자로 보내지 않음.
- 0 = `0`(화면) · 모름 = 페이지 말(M01·M02 `—` · B09 `빈칸`) · `0.0` 없음 · 인쇄는 실무대로 0 빈칸.
- 음수 = `-1,234`. 「원」 = 표 칸 안 붙임(머리 칸 단위) · 문장 안 = 숫자에 붙여 `1,234원` 한 꼴.
### D-2. 공용 꼴 한 벌(있는 것 재사용)
- TS = `formatMoney` · `formatPrice` · `formatNumber` 를 `common_util/common_util_money.ts` 로 옮기고 M01 두 파일은 다시 내보냄(부르는 쪽 안 고침 · `ui_template` 이 `common_util_time` 을 이미 가져오는 길과 같음). 더할 것 = `formatLineMoney`(최대 1 · 끝 0 뗌). ② 꼴(TS 를 서버 Node 로) 아님 — ① 파이썬 · TS 짝.
- 파이썬 짝 = `master_text.py` `fmt` · `fmt_money` · `fmt_price` + `fmt_line_money`. `master_text.py` 695줄 → 꼴 넷을 `master_fmt.py`(새)로 떼어 700줄 한도 지킴.
- 어긋남 셋 맞춤 — 파이썬 `quantize(…, ROUND_HALF_UP)` · TS `formatNumber` 유효숫자 넷 규칙.
- 거울 시험 = `resources/tester/test_588_2_money_fmt.py` + node 도우미 `.cjs`(본보기 `test_m02_labor_calc_mirror.py`) · 값 = 1.00005 · 0.00167 · 0.12345 · 2.5 · −1234.5 · 124,419.853 · 0 · 22.9 · 1,846.39.
- 데이터표 = 새 꼴 없이 열 `decimals` + `trim` 만 바르게(정본이 이미 버림이면 Intl 반올림 = 같은 글).
### D-3. 일감
| 일감 | 무엇 | 파일 · 크기 | 셈 바뀜 | 시험 |
|---|---|---|---|---|
| 588-2a 꼴 고침(B09 · 부품) | 격자 단가 칸 `decimals:3 trim` · 금액 칸 `decimals:1 trim`(`hopyo_grid.ts:101-115`) · B09 `money()` 1자리 = trim(`UI_Tabs.ts:176-183`) · 환율표 값 열(`UI_Tabs_Base.ts:104`) · 재료 · 자재단가대비 단가 자리(`:199-203 · 297`) · `UI_Import.ts:47` 빈 값 · `UI_Store.ts:136 · 164` | 파일 5 · 각 1~5줄 | 없음 | `test_704_3_hopyo_grid` · `test_155_b09_tabs` · `test_157_4_b09_labor_spec` |
| 588-2b 꼴 고침(M01 · M02 · 서버 글) | `Library_List.ts:66-67` · `Hopyo_Relink.ts:155-159` · `Labor_Paste.ts:172` · `Hopyo_Check.ts:165 · 204 · 470` · `Hopyo_CheckRows.ts:251` · `Hopyo_Sheet.ts:89` · `Hopyo_Choose.ts:37 · 55` · `Logic_Calc.ts:304-308`(돈 판정 = 비목 · 줄 이름) · `Logic_Edit.ts:278 · 285 · 349` · `M01_MasterData_Router.py:253`(`_num(_pct(…))`) · `master_text.py:159-163`(`줄.` 참조 = 줄 금액 꼴) | 파일 11 · 각 1~5줄 · `LogicLab_Ho.ts` 696줄 = 손대지 않음 | 없음 | `test_m01_text` · `test_722_ho_detail` · `test_714_2_calc_sheet` · `test_705_2_hopyo_paste` |
| 588-2c 공용 꼴 한 벌 | D-2 · B09 로컬 꼴(`UI_Tabs_Total.ts:34` · `Bill_Fold.ts:61` · `Sangeun_Sheet.ts:53` · `UI_Import.ts:361` · `Haul_Steps.ts:57-59`) 갈음 | 새 파일 셋(ts · py · 시험 + cjs) · 고침 6 | 없음 | 새 거울 시험 + 위 시험 |
| 588-2d M01 · M02 셈 끝수(물음 1 답 뒤) | 단가산출 · 일위대가 셈 = 줄 0.1원 버림 · 비목 소계 원 미만 버림 · 계 = 비목 합 — M02 길(`M02_Sangeun_Calc.py` · `M02_Labor_Doc.py` settle ↔ `M02_MasterTemplete_Labor_Calc.ts`)에만 · 엔진 `master_formula.py` 는 B09 산근도 불러 두 번 버림 위험 → 안 건드림 | 파일 3 · `M02_Labor_Doc.py` 689줄 → 끝수 떼어 새 파일 | 있음(테스트1 124,420 → 124,419) | `test_m02_labor_calc_mirror` · `test_704_settle` · `test_728_2_sk_unit` · `test_719_2_sk_project` |
| 588-2e 수량 반올림(물음 2 답 뒤 · 나중) | 품셈 1-2-1 지정 자리 반올림 뒤 셈 또는 식 칸 수량 길게 | 엔진 · B09 짝 | 1번 갈래면 있음 | — |
차례 = 2a · 2b(바로 · 서로 다른 파일) → 2c → 2d(답 뒤). 2a · 2b 만으로 `.0` · `4.0 %` · `870.2455` · `124,419.85` · 식 안 소수 셋이 사라지고, 2d 뒤에 「재료 줄 합 ≠ 소계」 · 1원 차이가 사라짐.
### D-4. 사용자에게 물을 갈래(쉬운 말)
1. (꼭) 「마스터 화면(M01 기초 · M02 단가산출 · 일위대가)의 금액도 공사(B09)처럼 품셈대로 원 아래를 버려 셀까요? 지금은 같은 『테스트1』 이 M02 에서 124,420원 · 공사에서 124,419원으로 1원 다름. 버리면 둘이 같아지고 줄 금액은 69,643.9 처럼 소수 한 자리로 보임.」 — 추천 = 버림(품셈 1-2-2 · B09 와 같음).
2. (나중) 「단가산출 줄의 수량이 0.2525 처럼 잘려 보여 계산기로 단가 × 수량을 하면 금액이 조금 다름(275,790 × 0.2525 = 69,637 · 화면 69,644). ① 수량을 보이는 자리로 반올림해 셈(금액이 조금 바뀜 · 품셈 1-2-1) ② 셈은 그대로 두고 수량을 더 길게 보임 — 어느 쪽?」
묻지 않고 정한 것 — 끝 0(일위대가표 뗌 · 산근 근거 글 붙임 = 실무 xlsx 그대로) · 「원」 표 칸 안 붙임 · 0 = `0`(화면).