變量定義:
- number:待轉換人民幣金額
注:人民幣金額單位為“元”,最多兩位小數(即精確到分),可以為負數,具體大寫規則參考文末的人民幣大寫的正確寫法注意事項。
在“元”之后、應寫“整”(或“正”)字;在“角”之后,可以不寫“整”(或“正”)字;大寫金額數字有“分”的,“分”后面不寫“整”(或“正”)字。
算法代碼(C#):
//人民幣金額大寫轉換
public static string ConvertToChinese(decimal number)
{
string s = number.ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A");
s = s.Replace("0B0A", "@");
string d = Regex.Replace(s, @"(((?<=-)|(?!-)^)[^1-9]*)|((?'z'0)[0A-E]*((?=[1-9])|(?'-z'(?=[F-L\.]|$))))|((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[\.]|$))))", "${b}${z}");
string r = Regex.Replace(d, ".", m => "負元空零壹貳叄肆伍陸柒捌玖空空空空空空整分角拾佰仟萬億兆京垓秭穰"[m.Value[0] - '-'].ToString());
return r;
}
算法實現:
- 利用格式化輸出把數字中間按順序插入大寫字母。
- 使用正則表達式把相鄰的大寫字母替換為空字符,並處理字符串中的零值(原本想簡化正則表達式,沒想到出了很多bug,只能改回原來的了...)。
- 最后把數字和字母替換成中文(字母替換為數字的十進制數位的中文名稱)。
注:核心思路是正則表達式和ASCII碼值運算。