訓練營 Day 6
金額大寫轉換的
遞迴算法解析
「國字大寫金額計算工具」技術核心
解析數字轉漢字的映射邏輯與嚴謹格式規範
資深前端工程團隊 製作
議程大綱
- 核心痛點:金融業為何需要嚴謹的大寫金額?
- 工具簡介:《自動化作業工具操作手冊彙編》解析
- 底層邏輯:數字與漢字的映射關係表
- 演算法剖析:遞迴分段 (Divide & Conquer) 策略
- 邊界條件處理:複雜的「零」字處理邏輯
- 小數格式規範:角、分與「整」的應用
- 實務應用與總結:從工具到自動化流程
金融作業的防偽與法律效力
在套印傳票、支票或合約時,金額不僅是數字,更是法律承諾。
阿拉伯數字 (易竄改)
$1,000
輕易被加上筆畫變成 $9,000
國字大寫 (高安全性)
新臺幣壹仟元整
筆劃繁複,完全杜絕塗改空間
國字大寫金額計算工具
根據《自動化作業工具操作手冊彙編》規範,該工具旨在消除人工轉寫錯誤。
標準操作流程:
- 輸入原始金額 (數字)。
- 系統自動帶出對應的國字大寫金額。
- 點選「複製金額(國字)」;精準貼上至傳票或其他系統。
看似簡單的 3 個步驟,背後需要極其嚴密的字串解析演算法支撐。
技術挑戰:直譯的謬誤
數字無法單純透過字元一對一替換 (Map) 來完成轉換。
| 數字字串 |
錯誤的一對一直譯 |
符合金融規範的正確輸出 |
| 1024 |
壹零貳肆 |
壹仟零貳拾肆元整 |
| 10000 |
壹零零零零 |
壹萬元整 |
我們需要處理位值 (權值),而非單純處理字元。
基礎映射字典 (Dictionaries)
演算法的基石是兩個預先定義好的陣列 (Array)。
// 1. 基數對應表
const NUM_CHARS = ['零', '壹', '貳', '參', '肆', '伍', '陸', '柒', '捌', '玖'];
// 2. 單位權值表 (由小到大)
const UNIT_CHARS = ['', '拾', '佰', '仟'];
const BIG_UNIT_CHARS = ['', '萬', '億', '兆'];
觀察:中文數字習慣以「四位數」為一個大單位 (萬、億) 進行循環。
遞迴策略 (Recursive Strategy)
利用中文數字每四位一循環的特性,實作 Divide & Conquer。
- 主問題:轉換 12345678
- 拆解:分為「1234」(萬) 與 「5678」(個)
- 子問題:轉換 4 位數字的邏輯是完全相同的!
- 組合:[轉 1234] + 萬 + [轉 5678]
步驟一:整小數分離與檢核
在遞迴開始前,必須確保資料乾淨且符合範圍。
function convertToFinancialChinese(amount) {
// 1. 轉型並檢查是否超過法定處理上限 (如兆位)
// 2. 分割整數部與小數部
let [integerPart, decimalPart] = String(amount).split('.');
// 3. 處理整數 (啟動遞迴)
let chineseInt = processInteger(integerPart);
// ...後續拼接小數
}
步驟二:四位元切割處理
將整數從尾部開始,每四位一組進行切塊處理。
123456789
[ 1 ] 億
[ 2345 ] 萬
[ 6789 ] (無)
每個陣列元素傳入核心邏輯 processFourDigits(str) 處理。
步驟三:單元內的轉換
處理單一區塊 (如 `2345`),加上權值 (拾、佰、仟)。
// 以 2345 為例
2 -> NUM_CHARS[2] + UNIT_CHARS[3] -> 貳仟
3 -> NUM_CHARS[3] + UNIT_CHARS[2] -> 參佰
4 -> NUM_CHARS[4] + UNIT_CHARS[1] -> 肆拾
5 -> NUM_CHARS[5] + UNIT_CHARS[0] -> 伍
// 結果:貳仟參佰肆拾伍
邊界處理:複雜的「零」
中文對於數字「零」的讀法有極為特殊的語法規則。
- 去除尾零:1000 → 壹仟 (非壹仟零零零)。
- 合併中零:1001 → 壹仟零壹 (非壹仟零佰零拾壹)。
- 跨域零處理:10000001 → 一千零一萬?不,是 壹仟萬零壹。
技術實作:使用 Regular Expression 全域替換 /零+/g 為單一「零」,並截斷尾部「零」。
格式規範:角、分與「整」
符合票據法的嚴謹輸出後綴規範。
| 情境 |
原始數值 |
規範輸出要求 |
| 無小數 (純整數) |
1200 |
壹仟貳佰元整 |
| 有角無分 |
1200.5 |
壹仟貳佰元伍角 |
| 有角有分 |
1200.56 |
壹仟貳佰元伍角陸分 |
規則:凡是結尾沒有到「分」的,皆需加上「整」(或正) 字結尾。
工具的防呆與驗證機制
在前端介面上,工具必須具備即時攔截錯誤的能力。
- 輸入過濾:只允許輸入 `0-9` 與小數點,阻斷英文或特殊符號。
- 極值限制:限定運算範圍 (如最大至千萬兆級),防止記憶體溢出。
- 無效格式處理:處理
00.5, .8, -100 等邊界輸入。
銜接自動化作業流程
如《手冊彙編》所述,此算法不僅用於計算機,更是套表核心。
前端工具
經辦人員臨時查詢與複製貼上 (Clipboard API)。
後台批次
整批匯款、大宗公文回覆檔案的自動轉譯填入。
課程總結
1. 遞迴降維:將龐大的天文數字轉化為重複的 4 位數解析。
2. 規則抽象化:透過字典陣列,抽離邏輯與資料,便於維護。
3. 嚴守法規:小數處理與「整」字的邏輯,是金融合規的關鍵最後一哩路。
Q & A
開放技術交流時間
Thank you for your attention.