首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言阿拉伯數字轉中文大寫金額:完整實作與金融標準解析

     編輯:C 語言問答

金融級數字轉中文大寫:從演算法到生產級程式碼

將 1325 轉為 壹仟參佰貳拾伍元整,涉及數字分段、零處理、單位映射、小數角分、負號、人民幣前綴等複雜規則。本文提供符合《中國人民銀行支付結算指南》的完整實作。

核心資料結構

// 中文數字映射
const char *CN_NUM[] = {"零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖"};
// 單位映射:索引對應位數(個、十、百、千、萬、億...)
const char *CN_UNIT[] = {
    "整", "元", "拾", "佰", "仟", "萬",
    "拾", "佰", "仟", "億",
    "拾", "佰", "仟", "萬億", "拾", "佰", "仟", "億億",
    "角", "分", "負", "人民幣"
};

狀態機解析輸入字串

採用有限狀態機(FSM)逐字元分析,狀態包括:START、MINUS、ZEROINT、INTEGER、DECIMAL、DECIMAL_FRACTION、END、ERROR。確保輸入格式合法(如避免前導零、多小數點)。

核心轉換邏輯(整數部分)


// 從最高位往最低位處理
for (int i = 0; i < int_len; i++) {
    int digit = integer[i];
    int pos = int_len - i; // 萬/億段內位置 1~4
    int segment_end = (pos % 4 == 0); // 是否為段尾(萬、億位)

    if (digit == 0) {
        if (!segment_end) zero_flag = 1; // 非段尾零:標記待輸出「零」
        else { // 段尾零
            if (int_len == 1 && dec_zero) output(CN_NUM[0]); // 僅個位零且無小數
            if (int_len != 1 || dec_zero) output(CN_UNIT[pos]); // 輸出萬/億單位
            zero_flag = 0;
        }
    } else { // 非零數字
        if (zero_flag) { output(CN_NUM[0]); zero_flag = 0; } // 補輸出「零」
        output(CN_NUM[digit]);
        output(CN_UNIT[pos]);
        if (segment_end) zero_flag = 0;
    }
}

小數部分處理(角、分)

  • 無小數或角分皆零 → 輸出「整」。
  • 角位非零 → 輸出數字+「角」。
  • 角位為零但分位非零 → 輸出「零」+ 分位數字+「分」(整數部分非零時)。

完整函數原型


// 回傳目的字串指標,錯誤回傳 NULL
char *chineseFee(char *dest, const char *src);

測試案例

輸入輸出
1325人民幣壹仟參佰貳拾伍元整
1001.05人民幣壹仟零壹元零伍分
-0.03人民幣負零元零參分
1000000人民幣壹佰萬元整

關鍵細節提醒

  1. 緩衝區安全:dest 需預留足夠空間(建議 100+ 位元組)。
  2. 輸入驗證:嚴格拒絕非數字、多小數點、前導零(如 0123)。
  3. 標準差異:銀行系統可能要求「圓」而非「元」、「拾萬」而非「壹拾萬」,依實際規格微調 CN_UNIT 陣列即可。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved