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();
}
}
}