// 例如:(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(); } } }
以下c#代码实现了将阿拉伯数字转换成中文大写金额的功能,并visual studio.net 2003 下调试基本通过(未经严格测试,希望各位发现错误后与作者联系*****************,或直接在csdn上回帖告知)。
代码的主调函数为convertsum,它的参数是string类型的数字字符串。在asp.net中调用方式如下: label1.text=convertsum(\"数字字符串\");
其代码如下:
//作者:fanz2000
//email:***************** ///
/// 转换数字金额主函数(包括小数) ///
/// 数字字符串
/// 转换成中文大写后的字符串或者出错信息提示字符串 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])+\"圆\";//转换整数部分 rstr+=convertxiaoshu(splitstr[1]);//转换小数部分 return rstr; } } ///
/// 判断是否是正数字字符串 ///
/// 判断字符串
/// 如果是数字,返回true,否则返回false public bool ispositvedecimal(string str) {
decimal d; try {
d=decimal.parse(str); }
catch(exception) {
return false; } if(d>0) return true; else return false; } ///
/// 转换数字(整数) ///
/// 需要转换的整数数字字符串 /// 转换成中文大写后的字符串 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.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)+\"萬\ tmpstr=str.substring(0,strlen-8);
rstr= string.concat(convertdigit(tmpstr)+\"億\ 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; } ///
/// 转换数字(小数部分) ///
/// 需要转换的小数部分数字字符串 /// 转换成中文大写后的字符串 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; } } ///
/// 转换数字 ///
/// 转换的字符串(四位以内) ///
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; } ///
/// 转换四位数字 ///
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; } ///
/// 转换三位数字 ///
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; } ///
/// 转换二位数字 ///
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; } ///
/// 将一位数字转换成中文大写数字 ///
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); }
private static String[] Ls_ShZ ={ \"零\壹\贰\叁\肆\伍\陆\柒\捌\玖\拾\" };
private static String[] Ls_DW_Zh ={ \"元\拾\佰\仟\万\02
拾\佰\仟\亿\拾\佰\仟\万\" }; private static String[] Num_DW ={ \"\拾\佰\仟\万\拾\03
佰\仟\亿\拾\佰\仟\万\" }; 04 private static String[] Ls_DW_X ={ \"角\分\" }; 05
06 /// 07 /// 金额小写转中文大写。 /// 整数支持到万亿;小数部分支持到分(超过两位将进行Banker舍入法处08 理) 09 ///
10 /// 需要转换的双精度浮点数 11 ///
Boolean iXSh_bool = false;//是否含有小数,默认没有(0则视为14
没有) Boolean iZhSh_bool = true;//是否含有整数,默认有(0则视为没15
有) 16
17 string NumStr;//整个数字字符串 18 string NumStr_Zh;//整数部分 19 string NumSr_X = \"\";//小数部分 20 string NumStr_DQ;//当前的数字字符 21 string NumStr_R = \"\";//返回的字符串 22
23 Num = Math.Round(Num, 2);//四舍五入取两位 24
25 //各种非正常情况处理 26 if (Num < 0)
27 return \"不转换欠条\"; 28 if (Num > 9999999999999.99)
29 return \"很难想象谁会有这么多钱!\";
30 if (Num == 0)
31 return Ls_ShZ[0]; 32
33 //判断是否有整数 34 if (Num < 1.00)
35 iZhSh_bool = false; 36
37 NumStr = Num.ToString(); 38
39 NumStr_Zh = NumStr;//默认只有整数部分 40 if (NumStr_Zh.Contains(\".\")) 41 {//分开整数与小数处理
NumStr_Zh = NumStr.Substring(0, 42
NumStr.IndexOf(\".\"));
NumSr_X = NumStr.Substring((NumStr.IndexOf(\".\") + 43
1), (NumStr.Length - NumStr.IndexOf(\".\") - 1)); 44 iXSh_bool = true; 45 } 46 47
48 if (NumSr_X == \"\" || int.Parse(NumSr_X) <= 0) 49 {//判断是否含有小数部分 50 iXSh_bool = false; 51 } 52
53 if (iZhSh_bool) {//整数部分处理
55 NumStr_Zh = Reversion_Str(NumStr_Zh);//反转字符串 56
57 for (int a = 0; a < NumStr_Zh.Length; a++) 58 {//整数部分转换
59 NumStr_DQ = NumStr_Zh.Substring(a, 1); 60 if (int.Parse(NumStr_DQ) != 0) NumStr_R = 61
Ls_ShZ[int.Parse(NumStr_DQ)] + Ls_DW_Zh[a] + NumStr_R; 62 else if (a == 0 || a == 4 || a == 8)
63 {
if (NumStr_Zh.Length > 8 && a == 4) 65 continue;
66 NumStr_R = Ls_DW_Zh[a] + NumStr_R; 67 }
else if (int.Parse(NumStr_Zh.Substring(a - 68
1, 1)) != 0) NumStr_R = 69
Ls_ShZ[int.Parse(NumStr_DQ)] + NumStr_R; 70
71 } 72
73 if (!iXSh_bool)
74 return NumStr_R + \"整\"; 75
76 //NumStr_R += \"零\"; 77 } 78
79 for (int b = 0; b < NumSr_X.Length; b++) 80 {//小数部分转换
81 NumStr_DQ = NumSr_X.Substring(b, 1); 82 if (int.Parse(NumStr_DQ) != 0)
NumStr_R += Ls_ShZ[int.Parse(NumStr_DQ)] + 83
Ls_DW_X[b]; 84 else if (b != 1 && iZhSh_bool)
85 NumStr_R += Ls_ShZ[int.Parse(NumStr_DQ)]; 86 } 87
88 return NumStr_R; 90 }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务