主入口:ConvertSum
public string ConvertSum(string numStr)
{
// 1. 合法性校驗
if (!IsPositiveDecimal(numStr)) return "輸入的不是正數字!";
if (double.Parse(numStr) > 999999999999.99) return "數字太大,請輸入一萬億元以下金額";
// 2. 分離整數與小數
string[] parts = numStr.Split('.');
if (parts.Length == 1) // 純整數
return ConvertData(parts[0]) + "圓整";
// 3. 整數部分 + 小數部分
string result = ConvertData(parts[0]) + "圓";
result += ConvertXiaoShu(parts[1]);
return result;
}
關鍵輔助方法
正數校驗
public bool IsPositiveDecimal(string s)
{
if (!decimal.TryParse(s, out var d)) return false;
return d > 0;
}
整數部分轉換(支持萬/億分組)
public string ConvertData(string intStr)
{
int len = intStr.Length;
if (len <= 4) return ConvertDigit(intStr);
string result = "";
if (len <= 8) // 萬級
{
string low = intStr.Substring(len - 4);
string high = intStr.Substring(0, len - 4);
result = ConvertDigit(high) + "萬" + ConvertDigit(low);
}
else if (len <= 12) // 億級
{
string low = intStr.Substring(len - 4);
string mid = intStr.Substring(len - 8, 4);
string high = intStr.Substring(0, len - 8);
result = ConvertDigit(high) + "億" + ConvertDigit(mid) + "萬" + ConvertDigit(low);
}
// 統一清理多餘零
result = result.Replace("零億", "億").Replace("零萬", "萬")
.Replace("零零", "零");
// 處理尾部「佰零/仟零/萬零/億零」
if (result.Length >= 2)
{
string tail = result.Substring(result.Length - 2);
if (tail == "佰零" || tail == "仟零" || tail == "萬零" || tail == "億零")
result = result.Substring(0, result.Length - 2) + tail[0];
}
return result;
}
小數部分轉換(角/分)
public string ConvertXiaoShu(string decStr)
{
if (decStr.Length == 1)
return ConvertChinese(decStr) + "角";
// 取前兩位
string r = ConvertChinese(decStr[0].ToString()) + "角" +
ConvertChinese(decStr[1].ToString()) + "分";
return r.Replace("零角", "").Replace("零分", "");
}
邊界與異常處理
- 輸入非數字、負數、超範圍 → 返回友好錯誤提示字符串。
- 小數位超過 2 位 → 僅取前兩位(角、分),其餘截斷。
- 整數部分為 0 →
ConvertData("0") 返回「零」,最終輸出「零圓...」。
擴展建議
- 使用
decimal 而非 double 避免浮點誤差。
- 將中文數字映射表提取為
static readonly string[],提升性能與可維護性。
- 考慮實現
IFormatProvider/ICustomFormatter,支持 string.Format("{0:CNY}", amount) 風格調用。