首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

中文大寫金額轉小寫數字:兩種演算法實作 (嚴格格式/自然語言支援)

     編輯:關於.NET

方法一:字串替換 + DataTable.Compute (格式嚴格)

將中文數字、單位對照表轉為數學運算式字串,再用 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)}");

方法二更健壯,適合真實世界輸入;方法一適合固定格式報表轉換。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved