C#数字金额转成大写汉字.....<在线等>
如题.在线等~
[解决办法]
/// <summary>
/// 转换人民币大小金额
/// </summary>
/// <param name="num">金额</param>
/// <returns>返回大写形式</returns>
public static string NumToCNum(decimal num)
{
string str1 = "零壹贰叁肆伍陆柒捌玖"; //0-9所对应的汉字
string str2 = "万仟佰拾亿仟佰拾万仟佰拾元角分"; //数字位所对应的汉字
string str3 = ""; //从原num值中取出的值
string str4 = ""; //数字的字符串形式
string str5 = ""; //人民币大写金额形式
int i; //循环变量
int j; //num的值乘以100的字符串长度
string ch1 = ""; //数字的汉语读法
string ch2 = ""; //数字位的汉字读法
int nzero = 0; //用来计算连续的零值是几个
int temp; //从原num值中取出的值
num = Math.Round(Math.Abs(num), 2); //将num取绝对值并四舍五入取2位小数
str4 = ((long)(num * 100)).ToString(); //将num乘100并转换成字符串形式
j = str4.Length; //找出最高位
if (j > 15) { return "溢出"; }
str2 = str2.Substring(15 - j); //取出对应位数的str2的值。如:200.55,j为5所以str2=佰拾元角分
//循环取出每一位需要转换的值
for (i = 0; i < j; i++)
{
str3 = str4.Substring(i, 1); //取出需转换的某一位的值
temp = Convert.ToInt32(str3); //转换为数字
if (i != (j - 3) && i != (j - 7) && i != (j - 11) && i != (j - 15))
{
//当所取位数不为元、万、亿、万亿上的数字时
if (str3 == "0")
{
ch1 = "";
ch2 = "";
nzero = nzero + 1;
}
else
{
if (str3 != "0" && nzero != 0)
{
ch1 = "零" + str1.Substring(temp * 1, 1);
ch2 = str2.Substring(i, 1);
nzero = 0;
}
else
{
ch1 = str1.Substring(temp * 1, 1);
ch2 = str2.Substring(i, 1);
nzero = 0;
}
}
}
else
{
//该位是万亿,亿,万,元位等关键位
if (str3 != "0" && nzero != 0)
{
ch1 = "零" + str1.Substring(temp * 1, 1);
ch2 = str2.Substring(i, 1);
nzero = 0;
}
else
{
if (str3 != "0" && nzero == 0)
{
ch1 = str1.Substring(temp * 1, 1);
ch2 = str2.Substring(i, 1);
nzero = 0;
}
else
{
if (str3 == "0" && nzero >= 3)
{
ch1 = "";
ch2 = "";
nzero = nzero + 1;
}
else
{
if (j >= 11)
{
ch1 = "";
nzero = nzero + 1;
}
else
{
ch1 = "";
ch2 = str2.Substring(i, 1);
nzero = nzero + 1;
}
}
}
}
}
if (i == (j - 11) || i == (j - 3))
{
//如果该位是亿位或元位,则必须写上
ch2 = str2.Substring(i, 1);
}
str5 = str5 + ch1 + ch2;
if (i == j - 1 && str3 == "0")
{
//最后一位(分)为0时,加上“整”
str5 = str5 + '整';
}
}
if (num == 0)
{
str5 = "零元整";
}
return str5;
}
}
[解决办法]
http://blog.csdn.net/kangyanwen2003/archive/2007/08/30/1765201.aspx
[解决办法]
/// <summary> /// 转换数字金额主函数(包括小数) /// </summary> /// <param name="str">数字字符串</param> /// <returns>转换成中文大写后的字符串或者出错信息提示字符串</returns> public string ConvertSum(string str) { if (!IsPositveDecimal(str)) return "格式错误!"; if (Double.Parse(str) > 999999999999.99) return "金额溢出"; char[] ch = new char[1]; ch[0] = '.'; //小数点 string[] splitstr = null; //定义按小数点分割后的字符串数组 splitstr = str.Split(ch[0]);//按小数点分割字符串 if (splitstr.Length == 1) //只有整数部分 return ConvertData(str) + "圆整"; else //有小数部分 { string rstr; rstr = ConvertData(splitstr[0]) + "圆";//转换整数部分 string xiaoshu=ConvertXiaoShu(splitstr[1]); rstr += (xiaoshu == "") ? "整" : xiaoshu;//转换小数部分 return rstr; } } /// <summary> /// 判断是否是正数字字符串 /// </summary> /// <param name="str"> 判断字符串</param> /// <returns>如果是数字,返回true,否则返回false</returns> public bool IsPositveDecimal(string str) { Decimal d; try { d = Decimal.Parse(str); } catch (Exception) { return false; } if (d > 0) return true; else return false; } /// <summary> /// 转换数字(整数) /// </summary> /// <param name="str">需要转换的整数数字字符串</param> /// <returns>转换成中文大写后的字符串</returns> public string ConvertData(string str) { string tmpstr = ""; string rstr = ""; int strlen = str.Length; if (strlen <= 4)//数字长度小于四位 { rstr = ConvertDigit(str); } else { if (strlen <= 8)//数字长度大于四位,小于八位 { tmpstr = str.Substring(strlen - 4, 4);//先截取最后四位数字 rstr = ConvertDigit(tmpstr);//转换最后四位数字 tmpstr = str.Substring(0, strlen - 4);//截取其余数字 //将两次转换的数字加上萬后相连接 rstr = String.Concat(ConvertDigit(tmpstr) + "萬", rstr); rstr = rstr.Replace("零萬", "萬"); rstr = rstr.Replace("零零", "零"); } else if (strlen <= 12)//数字长度大于八位,小于十二位 { tmpstr = str.Substring(strlen - 4, 4);//先截取最后四位数字 rstr = ConvertDigit(tmpstr);//转换最后四位数字 tmpstr = str.Substring(strlen - 8, 4);//再截取四位数字 rstr = String.Concat(ConvertDigit(tmpstr) + "萬", rstr); tmpstr = str.Substring(0, strlen - 8); rstr = String.Concat(ConvertDigit(tmpstr) + "億", rstr); rstr = rstr.Replace("零億", "億"); rstr = rstr.Replace("零萬", "零"); rstr = rstr.Replace("零零", "零"); rstr = rstr.Replace("零零", "零"); } } strlen = rstr.Length; if (strlen >= 2) { switch (rstr.Substring(strlen - 2, 2)) { case "佰零": rstr = rstr.Substring(0, strlen - 2) + "佰"; break; case "仟零": rstr = rstr.Substring(0, strlen - 2) + "仟"; break; case "萬零": rstr = rstr.Substring(0, strlen - 2) + "萬"; break; case "億零": rstr = rstr.Substring(0, strlen - 2) + "億"; break; } } return rstr; }
[解决办法]
/// <summary> /// 转换数字(小数部分) /// </summary> /// <param name="str">需要转换的小数部分数字字符串</param> /// <returns>转换成中文大写后的字符串</returns> public string ConvertXiaoShu(string str) { int strlen = str.Length; string rstr; if (strlen == 1) { rstr = ConvertChinese(str) + "角"; return rstr; } else { string tmpstr = str.Substring(0, 1); rstr = ConvertChinese(tmpstr) + "角"; tmpstr = str.Substring(1, 1); rstr += ConvertChinese(tmpstr) + "分"; rstr = rstr.Replace("零分", ""); rstr = rstr.Replace("零角", ""); return rstr; } } /// <summary> /// 转换数字 /// </summary> /// <param name="str">转换的字符串(四位以内)</param> /// <returns></returns> public string ConvertDigit(string str) { int strlen = str.Length; string rstr = ""; switch (strlen) { case 1: rstr = ConvertChinese(str); break; case 2: rstr = Convert2Digit(str); break; case 3: rstr = Convert3Digit(str); break; case 4: rstr = Convert4Digit(str); break; } rstr = rstr.Replace("拾零", "拾"); strlen = rstr.Length; return rstr; } /// <summary> /// 转换四位数字 /// </summary> public string Convert4Digit(string str) { string str1 = str.Substring(0, 1); string str2 = str.Substring(1, 1); string str3 = str.Substring(2, 1); string str4 = str.Substring(3, 1); string rstring = ""; rstring += ConvertChinese(str1) + "仟"; rstring += ConvertChinese(str2) + "佰"; rstring += ConvertChinese(str3) + "拾"; rstring += ConvertChinese(str4); rstring = rstring.Replace("零仟", "零"); rstring = rstring.Replace("零佰", "零"); rstring = rstring.Replace("零拾", "零"); rstring = rstring.Replace("零零", "零"); rstring = rstring.Replace("零零", "零"); rstring = rstring.Replace("零零", "零"); return rstring; } /// <summary> /// 转换三位数字 /// </summary> public string Convert3Digit(string str) { string str1 = str.Substring(0, 1); string str2 = str.Substring(1, 1); string str3 = str.Substring(2, 1); string rstring = ""; rstring += ConvertChinese(str1) + "佰"; rstring += ConvertChinese(str2) + "拾"; rstring += ConvertChinese(str3); rstring = rstring.Replace("零佰", "零"); rstring = rstring.Replace("零拾", "零"); rstring = rstring.Replace("零零", "零"); rstring = rstring.Replace("零零", "零"); return rstring; } /// <summary> /// 转换二位数字 /// </summary> public string Convert2Digit(string str) { string str1 = str.Substring(0, 1); string str2 = str.Substring(1, 1); string rstring = ""; rstring += ConvertChinese(str1) + "拾"; rstring += ConvertChinese(str2); rstring = rstring.Replace("零拾", "零"); rstring = rstring.Replace("零零", "零"); return rstring; } /// <summary> /// 将一位数字转换成中文大写数字 /// </summary> public string ConvertChinese(string str) { //"零壹贰叁肆伍陆柒捌玖拾佰仟萬億圆整角分" string cstr = ""; switch (str) { case "0": cstr = "零"; break; case "1": cstr = "壹"; break; case "2": cstr = "贰"; break; case "3": cstr = "叁"; break; case "4": cstr = "肆"; break; case "5": cstr = "伍"; break; case "6": cstr = "陆"; break; case "7": cstr = "柒"; break; case "8": cstr = "捌"; break; case "9": cstr = "玖"; break; } return (cstr); }
[解决办法]
<script language="javascript" type="text/javascript">function convertCurrency(currencyDigits) {// Constants:var MAXIMUM_NUMBER = 99999999999.99;// Predefine the radix characters and currency symbols for output:var CN_ZERO = "零";var CN_ONE = "壹";var CN_TWO = "贰";var CN_THREE = "叁";var CN_FOUR = "肆";var CN_FIVE = "伍";var CN_SIX = "陆";var CN_SEVEN = "柒";var CN_EIGHT = "捌";var CN_NINE = "玖";var CN_TEN = "拾";var CN_HUNDRED = "佰";var CN_THOUSAND = "仟";var CN_TEN_THOUSAND = "万";var CN_HUNDRED_MILLION = "亿";var CN_SYMBOL = "人民币";var CN_DOLLAR = "元";var CN_TEN_CENT = "角";var CN_CENT = "分";var CN_INTEGER = "整";// Variables:var integral; // Represent integral part of digit number.var decimal; // Represent decimal part of digit number.var outputCharacters; // The output result.var parts;var digits, radices, bigRadices, decimals;var zeroCount;var i, p, d;var quotient, modulus;// Validate input string:currencyDigits = currencyDigits.toString();if (currencyDigits == "") {alert("Empty input!");return "";}if (currencyDigits.match(/[^,.\d]/) != null) {alert("Invalid characters in the input string!");return "";}if ((currencyDigits).match(/^((\d{1,3}(,\d{3})*(.((\d{3},)*\d{1,3}))?)|(\d+(.\d+)?))$/) == null) {alert("Illegal format of digit number!");return "";}// Normalize the format of input digits:currencyDigits = currencyDigits.replace(/,/g, ""); // Remove comma delimiters.currencyDigits = currencyDigits.replace(/^0+/, ""); // Trim zeros at the beginning.// Assert the number is not greater than the maximum number.if (Number(currencyDigits) > MAXIMUM_NUMBER) {alert("Too large a number to convert!");return "";}// Process the coversion from currency digits to characters:// Separate integral and decimal parts before processing coversion:parts = currencyDigits.split(".");if (parts.length > 1) {integral = parts[0];decimal = parts[1];// Cut down redundant decimal digits that are after the second.decimal = decimal.substr(0, 2);}else {integral = parts[0];decimal = "";}// Prepare the characters corresponding to the digits:digits = new Array(CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT, CN_NINE);radices = new Array("", CN_TEN, CN_HUNDRED, CN_THOUSAND);bigRadices = new Array("", CN_TEN_THOUSAND, CN_HUNDRED_MILLION);decimals = new Array(CN_TEN_CENT, CN_CENT);// Start processing:outputCharacters = "";// Process integral part if it is larger than 0:if (Number(integral) > 0) {zeroCount = 0;for (i = 0; i < integral.length; i++) {p = integral.length - i - 1;d = integral.substr(i, 1);quotient = p / 4;modulus = p % 4;if (d == "0") {zeroCount++;}else {if (zeroCount > 0){outputCharacters += digits[0];}zeroCount = 0;outputCharacters += digits[Number(d)] + radices[modulus];}if (modulus == 0 && zeroCount < 4) {outputCharacters += bigRadices[quotient];}}outputCharacters += CN_DOLLAR;}// Process decimal part if there is:if (decimal != "") {for (i = 0; i < decimal.length; i++) {d = decimal.substr(i, 1);if (d != "0") {outputCharacters += digits[Number(d)] + decimals[i];}}}// Confirm and return the final output string:if (outputCharacters == "") {outputCharacters = CN_ZERO + CN_DOLLAR;}if (decimal == "") {outputCharacters += CN_INTEGER;}outputCharacters = CN_SYMBOL + outputCharacters;return outputCharacters;}</script><p>数字金额: <input id="Digits" name="Digits" /> <input id="Convert" onclick="Result.value = convertCurrency(Digits.value);" type="button" name="Convert" value="转 换" /> </p><p>大写金额: <input id="Result" size="60" name="Result" /> </p>
[解决办法]
/// <summary> /// 把數字轉換成對應的大寫錢數 /// </summary> /// <param name="strDigital">textbox内要轉換的數字</param> /// <returns>转换结果</returns> public string Zhuanhuan(string strDigital) { decimal dshuzi; dshuzi = decimal.Parse(this.txtDigital.Text.ToString()); if (dshuzi == 0) { ret = "零元整"; return ret; } string je = dshuzi.ToString("####.00"); if (je.Length > 15) return ""; je = new String('0',15 - je.Length) + je;//若小于15位长,前面补0 string stry = je.Substring(0,4);//取得'亿'单元 string strw = je.Substring(4,4);//取得'万'单元 string strg = je.Substring(8,4);//取得'元'单元 string strf = je.Substring(13,2);//取得小数部分 string str1 = "",str2 = "",str3 = ""; str1 = this.getupper(stry,"亿");//亿单元的大写 str2 = this.getupper(strw,"万");//万单元的大写 str3 = this.getupper(strg,"元");//元单元的大写 string str_y = "", str_w = ""; if (je[3] == '0' || je[4] == '0')//亿和万之间是否有0 str_y = "零"; if (je[7] == '0' || je[8] == '0')//万和元之间是否有0 str_w = "零"; ret = str1 + str_y + str2 + str_w + str3;//亿,万,元的三个大写合并 for (int i = 0 ;i < ret.Length;i++)//去掉前面的"零" { if (ret[i] != '零') { ret = ret.Substring(i); break; } } for (int i = ret.Length - 1;i > -1 ;i--)//去掉最后的"零" { if (ret[i] != '零') { ret = ret.Substring(0,i+1); break; } } if (ret[ret.Length - 1] != '元')//若最后不位不是'元',则加一个'元'字 ret = ret + "元"; if (ret == "零零元")//若为零元,则去掉"元数",结果只要小数部分 ret = ""; if (strf == "00")//下面是小数部分的转换 { ret = ret + "整"; } else { string tmp = ""; tmp = this.getint(strf[0]); if (tmp == "零") ret = ret + tmp; else ret = ret + tmp + "角"; tmp = this.getint(strf[1]); if (tmp == "零") ret = ret + "整"; else ret = ret + tmp + "分"; } if (ret[0] == '零') { ret = ret.Substring(1);//防止0.03转为"零叁分",而直接转为"叁分" } return ret;//完成,返回 } /// <summary> /// 把一个单元转为大写,如亿单元,万单元,个单元 /// </summary> /// <param name="str">这个单元的小写数字(4位长,若不足,则前面补零)</param> /// <param name="strDW">亿,万,元</param> /// <returns>转换结果</returns> private string getupper(string str,string strDW) { if (str == "0000") return ""; string ret = ""; string tmp1 = this.getint(str[0]) ; string tmp2 = this.getint(str[1]) ; string tmp3 = this.getint(str[2]) ; string tmp4 = this.getint(str[3]) ; if (tmp1 != "零") { ret = ret + tmp1 + "仟"; } else { ret = ret + tmp1; } if (tmp2 != "零") { ret = ret + tmp2 + "佰"; } else { if (tmp1 != "零")//保证若有两个零'00',结果只有一个零,下同 ret = ret + tmp2; } if (tmp3 != "零") { ret = ret + tmp3 + "拾"; } else { if (tmp2 != "零") ret = ret + tmp3; } if (tmp4 != "零") { ret = ret + tmp4 ; } if (ret[0] == '零')//若第一个字符是'零',则去掉 ret = ret.Substring(1); if (ret[ret.Length - 1] == '零')//若最后一个字符是'零',则去掉 ret = ret.Substring(0,ret.Length - 1); return ret + strDW;//加上本单元的单位 } /// <summary> /// 单个数字转为大写 /// </summary> /// <param name="c">小写阿拉伯数字 0---9</param> /// <returns>大写数字</returns> private string getint(char c) { string str = ""; switch ( c ) { case '0': str = "零"; break; case '1': str = "壹"; break; case '2': str = "贰"; break; case '3': str = "叁"; break; case '4': str = "肆"; break; case '5': str = "伍"; break; case '6': str = "陆"; break; case '7': str = "柒"; break; case '8': str = "拐"; break; case '9': str = "玖"; break; } return str; }
[解决办法]
// 例如:(new Money(200)).ToString() == "贰佰元"namespace Skyiv.Util{ using System.Text; class Test { static void Main() { for (;;) { System.Console.Write("金额: "); string s = System.Console.ReadLine(); decimal m; try { m = decimal.Parse(s); } catch { break; } System.Console.WriteLine("大写: " + new Money(m)); } } } // 该类重载的 ToString() 方法返回的是大写金额字符串 class Money { public string Yuan = "元"; // “元”,可以改为“圆”、“卢布”之类 public string Jiao = "角"; // “角”,可以改为“拾” public string Fen = "分"; // “分”,可以改为“美分”之类 static string Digit = "零壹贰叁肆伍陆柒捌玖"; // 大写数字 bool isAllZero = true; // 片段内是否全零 bool isPreZero = true; // 低一位数字是否是零 bool Overflow = false; // 溢出标志 long money100; // 金额*100,即以“分”为单位的金额 long value; // money100的绝对值 StringBuilder sb = new StringBuilder(); // 大写金额字符串,逆序 // 只读属性: "零元" public string ZeroString { get { return Digit[0] + Yuan; } } // 构造函数 public Money(decimal money) { try { money100 = (long)(money * 100m); } catch { Overflow = true; } if (money100 == long.MinValue) Overflow = true; } // 重载 ToString() 方法,返回大写金额字符串 public override string ToString() { if (Overflow) return "金额超出范围"; if (money100 == 0) return ZeroString; string [] Unit = { Yuan, "万", "亿", "万", "亿亿" }; value = System.Math.Abs(money100); ParseSection(true); for (int i = 0; i < Unit.Length && value > 0; i++) { if (isPreZero && !isAllZero) sb.Append(Digit[0]); if (i == 4 && sb.ToString().EndsWith(Unit[2])) sb.Remove(sb.Length - Unit[2].Length, Unit[2].Length); sb.Append(Unit[i]); ParseSection(false); if ((i % 2) == 1 && isAllZero) sb.Remove(sb.Length - Unit[i].Length, Unit[i].Length); } if (money100 < 0) sb.Append("负"); return Reverse(); } // 解析“片段”: “角分(2位)”或“万以内的一段(4位)” void ParseSection(bool isJiaoFen) { string [] Unit = isJiaoFen ? new string [] { Fen, Jiao } : new string [] { "", "拾", "佰", "仟" }; isAllZero = true; for (int i = 0; i < Unit.Length && value > 0; i++) { int d = (int)(value % 10); if (d != 0) { if (isPreZero && !isAllZero) sb.Append(Digit[0]); sb.AppendFormat("{0}{1}", Unit[i], Digit[d]); isAllZero = false; } isPreZero = (d == 0); value /= 10; } } // 反转字符串 string Reverse() { StringBuilder sbReversed = new StringBuilder(); for (int i = sb.Length - 1; i >= 0; i--) sbReversed.Append(sb[i]); return sbReversed.ToString(); } }}