最近在做项目中遇到这样一个问题, 要求将金额数字形式转换为汉语形式,例如: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 "非数字形式!"; } }其调用的过程跟法一是相同的,就不再叙述,运行结果如下:
小结:
虽然这样已经得到自己想要的结果,但这并不是最终的目的。首先这些方法都是通过查找资料找到的,还需要自己再用心的琢磨这个过程,真正的做到为我所用,并且可以到达更好的效果。在日常生活中,遇到问题,没有想法和思路时,不妨先站在巨人的肩膀上,等你有能力了,再去做那个可以让别人站的巨人。