阿拉伯數字金額轉換為漢語大寫
阿新 • • 發佈:2019-01-02
最近在做專案中遇到這樣一個問題, 要求將金額數字形式轉換為漢語形式,例如:101,轉換為壹佰零壹元。其實專案中已經給出了實現的程式碼,只不過感覺它寫的存在一點問題。那麼這個是如何實現的呢?
方法一:
轉換的方法如下:
然後寫資料進行測試:public static string Trans2RMB(string money) { #region 存在多餘零 //將小寫金額轉換成大寫金額 double MyNumber = Convert.ToDouble(money); String[] MyScale = { "分", "角", "元", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟", "兆", "拾", "佰", "仟" }; //單位對應的漢字 String[] MyBase = { "零", "壹", "貳", "叄", "肆", "伍", "陸", "柒", "捌", "玖" };//數字對應的漢字 String M = ""; bool isPoint = false; if (money.IndexOf(".") != -1) { money = money.Remove(money.IndexOf("."), 1);//去除小數點 isPoint = true; } for (int i = money.Length; i > 0; i--) { int MyData = Convert.ToInt16(money[money.Length - i].ToString());//? M += MyBase[MyData];//? if (isPoint == true) { M += MyScale[i - 1];//? } else { M += MyScale[i + 1];//? } } return M; #endregion }
public static void Main(string[] args) { money = "230067890080.01"; Console.WriteLine(Trans2RMB(money)); money = "230000000000.00"; Console.WriteLine(Trans2RMB(money)); money = "2300.00"; Console.WriteLine(Trans2RMB(money));
Console.ReadKey();
}
其執行結果如下:
該結果就是我在專案中所看到的結果,其中如果連續出現幾位都是“0”時,仍然將其轉換,就出現瞭如上圖所示的效果。很明顯,這樣的結果並不是我們所要的。
方法二:
轉換的方法如下:
其呼叫的過程跟法一是相同的,就不再敘述,執行結果如下:public static string CmycurD(decimal num) { string strCapital = "零壹貳叄肆伍陸柒捌玖"; //0-9所對應的漢字 string strCapitalUnit = "萬仟佰拾億仟佰拾萬仟佰拾元角分"; //金額單位所對應的漢字 string strCapitalMoney = ""; //人民幣大寫金額形式 string capitalNum = ""; //數字的漢語讀法 string capitalUnit = ""; //數字位的漢字讀法 int countZero = 0; //用來計算連續的零值是幾個 int temp; //從原num值中取出的值 num = Math.Round(Math.Abs(num), 2); //將num取絕對值並四捨五入取2位小數 string strNum = ((long)(num * 100)).ToString(); //將num中的小數點去除,並轉換成字串形式 int j = strNum.Length; //金額總長度(排除小數點),如101.01的j=5 if (j > 15) { return "溢位"; }//限制金額在萬億以下(在往上貌似也沒有這麼土豪。。) strCapitalUnit = strCapitalUnit.Substring(15 - j); //取出對應位數的所有的單位值。如:101.01,j為5所以strCapitalUnit=佰拾元角分 string strTempNum = ""; //用於存放從num值中依次取出的值,進行迴圈轉換 //迴圈取出每一位需要轉換的值 for (int i = 0; i < j; i++) { strTempNum = strNum.Substring(i, 1); //迴圈取出需轉換的每一位的值 temp = Convert.ToInt32(strTempNum); //轉換為數字 if (i != (j - 3) && i != (j - 7) && i != (j - 11) && i != (j - 15)) { //當所取位數不為元、萬、億、萬億上的數字時 if (strTempNum == "0") { capitalNum = ""; capitalUnit = ""; countZero = countZero + 1; } else { if (strTempNum != "0" && countZero != 0) { capitalNum = "零" + strCapital.Substring(temp * 1, 1); capitalUnit = strCapitalUnit.Substring(i, 1); countZero = 0; } else { capitalNum = strCapital.Substring(temp * 1, 1); capitalUnit = strCapitalUnit.Substring(i, 1); countZero = 0; } } } else { //該位是萬億,億,萬,元位等關鍵位 if (strTempNum != "0" && countZero != 0) { capitalNum = "零" + strCapital.Substring(temp * 1, 1); capitalUnit = strCapitalUnit.Substring(i, 1); countZero = 0; } else { if (strTempNum != "0" && countZero == 0) { capitalNum = strCapital.Substring(temp * 1, 1); capitalUnit = strCapitalUnit.Substring(i, 1); countZero = 0; } else { if (strTempNum == "0" && countZero >= 3) { capitalNum = ""; capitalUnit = ""; countZero = countZero + 1; } else { if (j >= 11) { capitalNum = ""; countZero = countZero + 1; } else { capitalNum = ""; capitalUnit = strCapitalUnit.Substring(i, 1); countZero = countZero + 1; } } } } } if (i == (j - 11) || i == (j - 3)) { //如果該位是億位或元位,則必須寫上 capitalUnit = strCapitalUnit.Substring(i, 1); } strCapitalMoney = strCapitalMoney + capitalNum + capitalUnit; if (i == j - 1 && strTempNum == "0") { //最後一位(分)為0時,加上“整” strCapitalMoney = strCapitalMoney + '整'; } } if (num == 0) { strCapitalMoney = "零元整"; } return strCapitalMoney; } public static string CmycurD(string numstr) { try { decimal num = Convert.ToDecimal(numstr); return CmycurD(num); } catch { return "非數字形式!"; } }
小結:
雖然這樣已經得到自己想要的結果,但這並不是最終的目的。首先這些方法都是通過查詢資料找到的,還需要自己再用心的琢磨這個過程,真正的做到為我所用,並且可以到達更好的效果。在日常生活中,遇到問題,沒有想法和思路時,不妨先站在巨人的肩膀上,等你有能力了,再去做那個可以讓別人站的巨人。