C 2 0純數學方法遞迴實現貨幣數字轉換中文

2021-04-13 21:16:05 字數 3719 閱讀 5344

最近由於專案的原因,需要寫乙個貨幣數字轉換中文的演算法,先在網了找了一下,結果發現無一列外都是用(replace)替換的方式來實現的,所以想寫個另外的演算法;因為本人是學數學出身的,所以用純數學的方法實現。

注意:本文中的演算法支援小於1023 (也就是9999億兆)貨幣數字轉化。

貨幣中文說明: 在說明**之前,首先讓我們回顧一下貨幣的讀法。

10020002.23  讀為 壹仟零貳萬零貳元貳角叄分

1020         讀為 壹仟零貳拾元整。

100000       讀為 拾萬元整

0.13         讀為 壹角叄分

**:

測試工程

static void main(string args)

catch (exception er)

}else

console.writeline("/n請輸入金額");

inputnum = console.readline();

}console.readline();}

測試結果如下:

貨幣轉化類(numcast類)功能介紹

1 常量的規定

///

/// 數字

///

public enum numlevel ;

///

/// 數字的指數

///

private int numlevelexponent = new int ;

///

/// 數字的中文字元

///

private string numleverchinesesign = new string ;

///

/// 大寫字元

///

private string numchinesecharacter = new string ;

///

/// 整(當沒有 角分 時)

///

private const string endofint = "整";

2:數字合法性驗證,採用正規表示式驗證

///

/// 正則表達驗證數字是否合法

///

///

///

public bool isvalidated(t num)

))(/./d)?$");

if (reg.i**atch(num.tostring()))

return false;}

4:判斷數字之間是否有跳位,也就是中文中間是否要加零,例如1020 就應該加零。

///

/// 是否跳位

///

///

private bool isdumplevel(double num)}}

return false;

5 把長數字分割為兩個較小的數字陣列,例如把9999億兆,分割為9999億和0兆,

因為計算機不支援過長的數字。

///

/// 是否大於兆,如果大於就把字串分為兩部分,

/// 一部分是兆以前的數字

/// 另一部分是兆以後的數字

///

///

///

private bool isbigthantillion(string num)

}else

}return isbig;

}///

/// 把數字字串由『兆』分開兩個

///

///

private double splitnum(string num)

7 合併大於兆連個陣列轉化成的貨幣字串

8:遞迴計算貨幣數字的中文

///

/// 計算中文字串

///

/// 數字

/// 數字級別 比如1000萬的 數字級別為萬

/// 是否以『壹拾』開頭

/// 中文大寫

public string calculatechinesesign(double num, numlevel? nl ,bool isdump,bool i***ceptten)

else

if (prefixnum < 10 )

else

//加上單位

if (currentlevel == numlevel.yuan )}}

else

//當真正的個位為零時 加上「元」

if (nl == null && postfixnun < 1 && currentlevel > numlevel.yuan && postfixnun > 0)

else

}//是否跳位

// 判斷是否加零, 比如302 就要給三百 後面加零,變為 三百零二。

if (isdumplevel(num))

else if (postfixnun == 0 && currentlevel > numlevel.yuan )

}return result;

}小結:

個人認為程式的靈魂是演算法,大到乙個系統中的業務邏輯,小到乙個貨幣數字轉中文的演算法,處處都體現一種邏輯思想。

是否能把需求抽象成乙個好的數學模型,直接關係到程式的實現的複雜度和穩定性。在一些常用功能中想些不一樣的演算法,對我們開拓思路很有幫助。

9:外部呼叫的轉換方法。

///

/// 外部呼叫的轉換方法

///

///

///

public string converttochinese(string num)

string chinesecharactor = string.empty;

if (isbigthantillion(num))

else

return chinesecharactor;

}///

/// 合併分開的陣列中文貨幣字元

///

///

///

private string contactnumchinese(double tillionnums)

else

else

}return chinesecharactor;

}6 是否以「壹拾」開頭,如果是就可以把它變為「拾」

bool isstartoften = false;

while (num >=10)

//num的數字

numlevel currentlevel = getnumlevel(num);

int numexponent = this.numlevelexponent[(int)currentlevel];

num = convert.toint32(math.floor(num / math.pow(10, numexponent)));

if (currentlevel == numlevel.ten && num == 1)

}return isstartoften;

3: 獲取數字 例如 1000的數字為 numlevel.thousand

///

/// 獲取數字的數字 使用log

///

///

///

private numlevel getnumlevel(double num)}}

else

return nlvl;

C 2 0純數學方法遞迴實現貨幣數字轉換中文

border 0 name i1 align middle marginwidth 1 marginheight 1 src frameborder 0 width 336 scrolling no height 280 注意 本文中的演算法支援小於1023 也就是9999億兆 貨幣數字轉化。貨幣中...

C 純數學方法遞迴實現貨幣數字轉換中文

乙個貨幣數字轉換中文的演算法,注意 本文中的演算法支援小於1023 也就是9999億兆 貨幣數字轉化。貨幣中文說明 在說明 之前,首先讓我們回顧一下貨幣的讀法。10020002.23 讀為 壹仟零貳萬零貳元貳角叄分 1020 讀為 壹仟零貳拾元整。100000 讀為 拾萬元整 0.13 讀為 壹角叄...

C 20新特性 數學計算庫

數學常數 增加了,其中定義了常用的數學常數,如e,log2e,sqrt2,sqrt3等。bit操作 新增了一些列bit的操作,如按位判斷有幾個0,幾個1等,具體內容參加庫函式說明,用法示意如下 std bit cast在gcc10.2中未被支援 void test bit endian判斷 std ...