C#把数字转换成大写金额的代码实例
实现代码:
//例如:(newMoney(200)).ToString()=="贰佰元" namespaceSkyiv.Util{ usingSystem.Text; classTest{ staticvoidMain(){ for(;;){ System.Console.Write("金额:"); strings=System.Console.ReadLine(); decimalm; try{ m=decimal.Parse(s); }catch{ break; } System.Console.WriteLine("大写:"+newMoney(m)); } } } //该类重载的ToString()方法返回的是大写金额字符串 classMoney{ publicstringYuan="元";//“元”,可以改为“圆”、“卢布”之类 publicstringJiao="角";//“角”,可以改为“拾” publicstringFen="分";//“分”,可以改为“美分”之类 staticstringDigit="零壹贰叁肆伍陆柒捌玖";//大写数字 boolisAllZero=true;//片段内是否全零 boolisPreZero=true;//低一位数字是否是零 boolOverflow=false;//溢出标志 longmoney100;//金额*100,即以“分”为单位的金额 longvalue;//money100的绝对值 StringBuildersb=newStringBuilder();//大写金额字符串,逆序 //只读属性:"零元" publicstringZeroString{ get{ returnDigit[0]+Yuan; } } //构造函数 publicMoney(decimalmoney){ try{ money100=(long)(money*100m); }catch{ Overflow=true; } if(money100==long.MinValue)Overflow=true; } //重载ToString()方法,返回大写金额字符串 publicoverridestringToString(){ if(Overflow)return"金额超出范围"; if(money100==0)returnZeroString; string[]Unit={ Yuan, "万", "亿", "万", "亿亿" }; value=System.Math.Abs(money100); ParseSection(true); for(inti=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("负"); returnReverse(); } //解析“片段”:“角分(2位)”或“万以内的一段(4位)” voidParseSection(boolisJiaoFen){ string[]Unit=isJiaoFen?newstring[]{ Fen, Jiao }:newstring[]{ "", "拾", "佰", "仟" }; isAllZero=true; for(inti=0;i<Unit.Length&&value>0;i++){ intd=(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; } } //反转字符串 stringReverse(){ StringBuildersbReversed=newStringBuilder(); for(inti=sb.Length-1;i>=0;i--)sbReversed.Append(sb[i]); returnsbReversed.ToString(); } } }