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

C/C++ 實作:阿拉伯數字轉中文大寫金額(財務專用格式)

     編輯:關於C++

財務系統常需將數字轉換為中文大寫金額格式(壹貳參肆伍陸柒捌玖拾佰仟萬億)。本文提供完整 C 語言實作,正確處理整數部分分組(萬/億)、零值抑制、小數部分逐位轉換等細節。

核心演算法

  1. 分離整數與小數部分
  2. 整數部分:個位至高位逐位提取存入陣列,按 4 位分組(萬/億)處理零值抑制
  3. 小數部分:乘 10 迴圈轉為整數處理,逐位輸出
  4. 特殊處理:萬/億位為零時不輸出「零」,組內連續零僅輸出一個「零」

完整程式碼

#include <stdio.h>

void main() {
    double x, y;
    char *ch[] = {"零","壹","貳","參","肆","伍","陸","柒","捌","玖"};
    char *ch1[] = {"拾","佰","仟","萬","拾","佰","仟","億"};
    char num[256];
    long i, n, j, m, y1;

    printf("input: ");
    scanf("%lf", &x);
    
    n = (long)x;           // 整數部分
    y = x - n;             // 小數部分
    
    // 整數部分逐位拆解(低位在前)
    for (i = 0; n != 0; i++) {
        num[i] = (char)(n % 10);
        n /= 10;
    }
    m = i;
    num[i] = '.';          // 小數點分隔符
    
    // 小數部分轉整數處理
    for (y = y * 10; (long)((y - (long)y) * 10); )
        y *= 10;
    y1 = (long)y;
    for (i = m + 1; y1 != 0; i++) {
        num[i] = (char)(y1 % 10);
        y1 /= 10;
    }
    
    // 整數部分輸出(從高位到低位)
    for (n = 0;; n++) {
        if (num[n] == '.') {
            for (j = n - 1; j >= 0; j--) {
                // 萬/億位零值抑制邏輯
                if (m <= 5) {
                    if (m == 5 && (int)num[j] == 0) ;  // 萬位為零不輸出
                    else printf("%s", ch[(int)num[j]]);
                } else {
                    if (m % 4 == 0 && (int)num[j] == 0) ;  // 億位等為零不輸出
                    else printf("%s", ch[(int)num[j]]);
                }
                // 輸出單位(拾/佰/仟/萬/億)
                if (m >= 2) {
                    printf("%s", ch1[m - 2]);
                    m--;
                }
            }
            printf("點");  // 小數點
            break;
        }
    }
    
    // 小數部分輸出
    for (i = i - 1; num[i] != '.'; i--)
        printf("%s", ch[(int)num[i]]);
}

關鍵細節說明

  • 分組處理:每 4 位一組(個/拾/佰/仟 → 萬 → 億),單位陣列 ch1 循環使用
  • 零值抑制:組內連續零合併輸出單一「零」;組邊界(萬/億位)為零時完全不輸出
  • 小數處理:無單位,逐位直接轉換(如 0.123 → 「零點壹貳參」)
  • 緩衝區大小:num[256] 足夠處理極大數值

測試範例

輸入輸出
12345.67壹萬貳仟參佰肆拾伍點陸柒
1000000壹佰萬點
1001000壹佰萬零壹仟點
0.05零點零伍

擴充建議

  • 封裝為可重用函數 char* NumberToChinese(double value)
  • 支援負數處理(輸出「負」前綴)
  • 加入四捨五入至指定小數位功能
  • C++ 版可使用 std::string 避免緩衝區溢位風險
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved