訓練營 Day 6

金額大寫轉換的
遞迴算法解析

「國字大寫金額計算工具」技術核心

解析數字轉漢字的映射邏輯與嚴謹格式規範

資深前端工程團隊 製作

議程大綱

  • 核心痛點:金融業為何需要嚴謹的大寫金額?
  • 工具簡介:《自動化作業工具操作手冊彙編》解析
  • 底層邏輯:數字與漢字的映射關係表
  • 演算法剖析:遞迴分段 (Divide & Conquer) 策略
  • 邊界條件處理:複雜的「零」字處理邏輯
  • 小數格式規範:角、分與「整」的應用
  • 實務應用與總結:從工具到自動化流程

金融作業的防偽與法律效力

在套印傳票、支票或合約時,金額不僅是數字,更是法律承諾

阿拉伯數字 (易竄改)

$1,000

輕易被加上筆畫變成 $9,000

國字大寫 (高安全性)

新臺幣壹仟元整

筆劃繁複,完全杜絕塗改空間

國字大寫金額計算工具

根據《自動化作業工具操作手冊彙編》規範,該工具旨在消除人工轉寫錯誤。

標準操作流程:

  1. 輸入原始金額 (數字)。
  2. 系統自動帶出對應的國字大寫金額。
  3. 點選「複製金額(國字)」;精準貼上至傳票或其他系統。

看似簡單的 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] -> 伍
// 結果:貳仟參佰肆拾伍

邊界處理:複雜的「零」

中文對於數字「零」的讀法有極為特殊的語法規則。

  1. 去除尾零:1000 → 壹仟 (非壹仟零零零)。
  2. 合併中零:1001 → 壹仟零壹 (非壹仟零佰零拾壹)。
  3. 跨域零處理: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.