將 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 | 人民幣壹佰萬元整 |
dest 需預留足夠空間(建議 100+ 位元組)。0123)。CN_UNIT 陣列即可。