將中文數字、單位對照表轉為數學運算式字串,再用 DataTable.Compute 計算。
private float GetMoney(string strBig) {
string strExp = "";
string[] arrBig = { "整","", "零","+0", "壹","+1", "貳","+2", "三","+3", "肆","+4", "伍","+5", "陸","+6", "柒","+7", "捌","+8", "玖","+9",
"分","*0.01", "角","*0.1", "元","*1", "拾","*10.00", "佰","*100.00", "仟","*1000.00", "萬","*10000.00", "億","*100000000.00" };
for (int i = 0; i < strBig.Length; i++) {
for (int j = 0; j < arrBig.Length - 1; j += 2) {
if (arrBig[j] == strBig[i].ToString()) { strExp += arrBig[j + 1]; break; }
}
}
object ret = new DataTable().Compute(strExp, "");
return float.Parse(ret.ToString());
}
// GetMoney("玖仟零貳拾壹元陸角肆分") → 9021.64
支援「點/塊/毛」、「萬萬→億」、「零幺/壹貳」等口語寫法,單次遍歷計算,效能更好。
public double DecodeMoneyCn(string AText) {
AText = AText.Replace("萬萬", "億").Replace("點", "元").Replace("塊", "元").Replace("毛", "角");
double vResult = 0, vNumber = 0, vTemp = 0; int vDecimal = 0;
foreach (char vChar in AText) {
int i = "零一二三四五六七八九".IndexOf(vChar);
if (i < 0) i = "零幺兩三四五六七八九".IndexOf(vChar);
if (i < 0) i = "零壹貳三肆伍陸柒捌玖".IndexOf(vChar);
if (i > 0) {
vNumber = i;
if (vDecimal > 0) { vResult += vNumber * Math.Pow(10, -vDecimal); vDecimal++; vNumber = 0; }
} else {
i = "元十百千萬億".IndexOf(vChar);
if (i < 0) i = "整拾佰仟萬億".IndexOf(vChar);
if (i == 5) i = 8; // 億
if (i > 0) {
if (i >= 4) { vTemp += vNumber; if (vTemp == 0) vTemp = 1; vResult += vTemp * Math.Pow(10, i); vTemp = 0; }
else vTemp += vNumber * Math.Pow(10, i);
} else {
i = "元角分".IndexOf(vChar);
if (i > 0) { vTemp += vNumber; vResult += vTemp * Math.Pow(10, -i); vTemp = 0; }
else if (i == 0) { vTemp += vNumber; vResult += vTemp; vDecimal = 1; vTemp = 0; }
}
vNumber = 0;
}
}
return vResult + vTemp + vNumber;
}
string[] tests = { "十二點五六", "一億零一萬零五", "四萬萬", "九十八億七千六百五十四萬三千二百一十",
"五元一角四分", "壹佰元整", "三千五百萬", "九塊二毛" };
foreach (var t in tests) Console.WriteLine($"DecodeMoneyCn({t}) = {DecodeMoneyCn(t)}");
方法二更健壯,適合真實世界輸入;方法一適合固定格式報表轉換。