最近由於專案的原因,需要寫乙個貨幣數字轉換中文的演算法,先在網了找了一下,結果發現無一列外都是用(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 ...