金钱形式转换为中文大写
第一种:
using System.Text.RegularExpressions; private string DaXie(string money) { string s = double.Parse(money).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"); 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}"); return Regex.Replace(d, ".", delegate(Match m) { return "负圆空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟万億兆京垓秭穰"[m.Value[0] - '-'].ToString(); }); }
第二种:
private static string[] HanDigiStr = { "零 ", "壹 ", "贰 ", "叁 ", "肆 ", "伍 ", "陆 ", "柒 ", "捌 ", "玖 " }; private static string[] HanDiviStr = { " ", "拾 ", "佰 ", "仟 ", "万 ", "拾 ", "佰 ", "仟 ", "亿 ", "拾 ", "佰 ", "仟 ", "万 ", "拾 ", "佰 ", "仟 ", "亿 ", "拾 ", "佰 ", "仟 ", "万 ", "拾 ", "佰 ", "仟 " }; private static string PositiveIntegerToHanStr(string NumStr) { // 输入字符串必须正整数,只允许前导空格(必须右对齐),不宜有前导零 string RMBStr = " "; int len, n; bool hasvalue = false, lastzero = false; // 亿、万进位前有数值标记 len = NumStr.Length; for (int i = 0; i < len; i++) { // if( NumStr[i]== ' ' ) continue; // AnsiString[] base is 1 n = (NumStr[i] - '0'); // if( n <0 || n> 9 ) return "输入含非数字字符! "; int j = len - i - 1; if (n != 0) { if (lastzero) RMBStr += HanDigiStr[0]; // 若干零后若跟非零值,只显示一个零 // 除了亿万前的零不带到后面 // if( !( n==1 && (i%4)==1 && (lastzero || i==len-1) ) ) // 如十进位前有零也不发壹音用此行 // if( !( n==1 && (i%4)==1 && i==len-1 ) ) // 十进位处于第一位不发壹音 RMBStr += HanDigiStr[n]; RMBStr += HanDiviStr[len - i - 1]; // 非零值后加进位,个位为空 hasvalue = true; // 置万进位前有值标记 } else { if (j == 8 || j == 4 && hasvalue) // 亿万之间必须有非零值方显示万 RMBStr += HanDiviStr[len - i - 1]; // “亿”或“万” } if (j % 8 == 0) hasvalue = false; // 万进位前有值标记逢亿复位 lastzero = (n == 0) && (j % 4 != 0); // 亿万前有零后不加零,如:拾万贰仟 } if (RMBStr.Length == 0) return HanDigiStr[0]; // 输入空字符或 "0 ",返回 "零 " return RMBStr; } public static string NumToRMBStr(double val) { if (val > 100000000000) return "数字过大! "; //不小于千亿(可以更大点但没有什么意义了) string SignStr = " ", TailStr = " "; double fraction = 0; Int64 integer = 0; if (val < 0) { val = -val; SignStr = "负 "; } integer = Convert.ToInt64(val - val % 1); //整数部分 由于ToInt64本身有四舍五入功能所以要加 val%1 部分 int jiao, fen; fraction = Math.Round(val % 1, 2); // 四舍五入到分 在.Net中四舍五入有点争议,它是伍不进位的。 fen = Convert.ToInt32((fraction * 100) % 10);//分 jiao = Convert.ToInt32((fraction * 100 - fen) / 10);//角 if (jiao == 0 && fen == 0) { TailStr = "整 "; } else { TailStr = HanDigiStr[jiao]; if (jiao != 0) TailStr += "角 "; if (integer == 0 && jiao == 0) // 零元后不写零几分 TailStr = " "; if (fen != 0) TailStr += HanDigiStr[fen] + "分 "; } // 下一行可用于非正规金融场合,0.03只显示“叁分”而不是“零元叁分” // if( integer==0 ) return SignStr+TailStr; return SignStr + PositiveIntegerToHanStr(integer.ToString()) + "元 " + TailStr; }