財務系統常需將數字轉換為中文大寫金額格式(壹貳參肆伍陸柒捌玖拾佰仟萬億)。本文提供完整 C 語言實作,正確處理整數部分分組(萬/億)、零值抑制、小數部分逐位轉換等細節。
#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]]);
}
ch1 循環使用num[256] 足夠處理極大數值| 輸入 | 輸出 |
|---|---|
| 12345.67 | 壹萬貳仟參佰肆拾伍點陸柒 |
| 1000000 | 壹佰萬點 |
| 1001000 | 壹佰萬零壹仟點 |
| 0.05 | 零點零伍 |
char* NumberToChinese(double value)std::string 避免緩衝區溢位風險