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

C# 2.0 純數學遞迴演算法實作貨幣數字轉中文大寫

     編輯:關於C語言

前言

專案需求需將貨幣數字轉為中文大寫(如 10020002.23 → 壹仟零貳萬零貳元貳角三分)。網路常見做法多用 Replace 字串取代,本文採用純數學遞迴演算法,支援 10²³ 以內(9999 億兆)金額,精確至分。

中文貨幣讀法規則回顧

  • 10020002.23 → 壹仟零貳萬零貳元貳角三分
  • 1020 → 壹仟零貳拾元整
  • 100000 → 拾萬元整
  • 0.13 → 壹角三分

核心類別 NumCast 設計

1. 常數定義

public enum NumLevel { Cent, Chiao, Yuan, Ten, Hundred, Thousand, TenThousand, HundredMillion, Trillion }
private int[] NumLevelExponent = { -2, -1, 0, 1, 2, 3, 4, 8, 12 };      // 10 的指數
private string[] NumLevelChinese = { "分", "角", "元", "拾", "佰", "仟", "萬", "億", "兆" };
private string[] NumChineseChar = { "零", "壹", "貳", "三", "肆", "伍", "陸", "柒", "捌", "玖" };
private const string EndOfInt = "整";

2. 數字合法性驗證(正則表達式)

public bool IsValidated<T>(T num)
{
    var reg = new Regex(@"^(([0])|([1-9]\d{0,23}))(\.\d{1,2})?$");
    return reg.IsMatch(num.ToString());
}

3. 取得數字位級 GetNumLevel

利用 Math.Log10 計算數量級,對應 NumLevel 列舉。

4. 判斷是否跨位(需補「零」)IsJumpLevel

比較當前位級與餘數最高位級,差距 > 1 表示需補零(如 302 → 三百零二)。

5. 處理超過「兆」的大數字分割 SplitNum

將超出 double 精確範圍的數字字串,以「兆」為界分為高低兩段 double[],分別轉換再合併。

6. 判斷是否以「壹拾」開頭 IsStartWithTen

中文習慣「壹拾」簡寫為「拾」,需偵測並處理。

7. 遞迴核心 CalculateChineseSign

  • 將數字拆解為 prefixNum(最高位數字)與 postfixNum(餘數)。
  • 遞迴處理前綴,加上單位字元(萬、億、兆)。
  • 依 IsJumpLevel 決定是否插入「零」。
  • 處理小數部分(角、分)與「元整」結尾邏輯。

8. 公開轉換入口 ConvertToChinese

public string ConvertToChinese(string numStr)
{
    if (!IsValidated(numStr))
        throw new OverflowException("格式錯誤或超過 9999 億兆");

    if (IsBigThanTrillion(numStr))
    {
        var parts = SplitNum(numStr);
        return CombineTrillionParts(parts);
    }
    else
    {
        double val = Convert.ToDouble(numStr);
        return CalculateChineseSign(val, null, true, IsStartWithTen(val));
    }
}

測試範例

static void Main()
{
    var nc = new NumCast();
    Console.WriteLine(nc.ConvertToChinese("10020002.23")); // 壹仟零貳萬零貳元貳角三分
    Console.WriteLine(nc.ConvertToChinese("1020"));        // 壹仟零貳拾元整
    Console.WriteLine(nc.ConvertToChinese("0.13"));        // 壹角三分
}

小結

將需求抽象為數學模型(位級指數、遞迴分解、跨位判斷),比字串取代法更具擴充性與邏輯嚴謹性。演算法靈魂在於數學建模,能有效降低程式複雜度並提升穩定性。

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