功能規格
- 輸入:正數字串(含小數),最大支援 9,999 億(
999999999999.99)。
- 輸出:中文大寫金額,如
"壹仟貳佰叁拾肆圓伍角陸分"。
- 單位:圓、角、分、拾、佰、仟、萬、億。
- 零值處理:連續零合併、尾端零簡化(如「佰零」→「佰」)。
核心演算法
- 驗證輸入:
Decimal.TryParse 確認正數,長度限制。
- 分割整數/小數:以小數點分離。
- 整數部分分段處理:每 4 位一組(個、萬、億),呼叫
Convert4Digit、Convert3Digit、Convert2Digit、ConvertDigit。
- 小數部分:角、分兩位獨立轉換,零值省略。
- 後處理清理:正則替換多餘「零」、「零萬」、「零億」等。
關鍵方法實作
public string ConvertSum(string numStr)
{
if (!decimal.TryParse(numStr, out var val) || val <= 0) return "輸入必須為正數";
if (val > 999999999999.99m) return "金額超過上限(9,999 億)";
string[] parts = numStr.Split('.');
string intPart = parts[0];
string result = ConvertInteger(intPart) + "圓";
if (parts.Length > 1) result += ConvertDecimal(parts[1]);
else result += "整";
return result;
}
private string ConvertInteger(string s)
{
if (s.Length <= 4) return Convert4Digit(s.PadLeft(4, '0')).TrimStart('零');
if (s.Length <= 8)
{
string high = s.Substring(0, s.Length - 4);
string low = s.Substring(s.Length - 4);
return ConvertInteger(high).TrimEnd('零') + "萬" + Convert4Digit(low).TrimStart('零');
}
// 8~12 位:億、萬、個
string yi = s.Substring(0, s.Length - 8);
string wan = s.Substring(s.Length - 8, 4);
string ge = s.Substring(s.Length - 4);
return ConvertInteger(yi).TrimEnd('零') + "億" +
Convert4Digit(wan).TrimStart('零').TrimEnd('零') + "萬" +
Convert4Digit(ge).TrimStart('零');
}
private string Convert4Digit(string four) // 四位字串,不足左補零
{
string[] digits = { "零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖" };
string r = "";
r += digits[four[0]-'0'] + "仟";
r += digits[four[1]-'0'] + "佰";
r += digits[four[2]-'0'] + "拾";
r += digits[four[3]-'0'];
return r.Replace("零仟", "零").Replace("零佰", "零").Replace("零拾", "零").Replace("零零", "零");
}
private string ConvertDecimal(string dec)
{
if (dec.Length == 0) return "";
string[] digits = { "零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖" };
string r = "";
if (dec.Length >= 1) r += digits[dec[0]-'0'] + "角";
if (dec.Length >= 2) r += digits[dec[1]-'0'] + "分";
return r.Replace("零角", "").Replace("零分", "");
}
測試案例
| 輸入 | 輸出 |
| 1234.56 | 壹仟貳佰參拾肆圓伍角陸分 |
| 1000000 | 壹佰萬圓整 |
| 100000000 | 壹億圓整 |
| 1001001.01 | 壹佰萬零壹仟零壹圓零壹分 |
| 0.1 | 壹角 |
擴充建議
- 支援負數、貨幣符號前綴。
- 改用
StringBuilder 提升效能。
- 單元測試覆蓋邊界:0、最大值、小數位數變化、全零段落。