请问谁有将小写阿拉伯数字转换为大写中文金额的C#程序? 如将 1024.67 转换为 壹仟零贰拾肆圆陆角柒分我写一个程序需要用到.谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 // 例如:(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(); } }} static void Main() { Application.Run(new Form1()); } private void Form1_Load(object sender, System.EventArgs e) { this.textBox1.Text="12,789,24.01"; this.textBox2.Text=""; } private void button1_Click(object sender, System.EventArgs e) { string s=this.textBox1.Text.Trim(); s=s.Replace(",",""); //有无 " ." if(s.IndexOf(".")==-1) { s=s+".00"; } string []a=s.Split('.'); //存放结果 char []m=a[0].ToCharArray(); char []n=a[1].ToCharArray(); string box=dowork(m,n); this.textBox2.Text=box+"整"; } private string dowork(char [] s1,char []s2) { string [] R1=new string[]{"仟","佰","拾","元"};//长度为4 string [] R2=new string[]{"角","分"};//长度为2 //处理整数部分 int len=s1.Length; int len2=s2.Length; string box=""; string box1=""; string box2=""; string box3=""; char []a=null; char []b=null; char []c=null; //是否过亿 if(len>=9) { a=new char[len-8]; b=new char[4]; c=new char[4]; Array.Copy(s1,0,a,0,len-8); Array.Copy(s1,len-8,b,0,4); Array.Copy(s1,len-4,c,0,4); a=rep(a,len-8); b=rep(b,4); c=rep(c,4); } //是否过万 if(len>=5 &&len<=8) { b=new char[len-4]; c=new char[4]; Array.Copy(s1,0,b,0,len-4); Array.Copy(s1,len-4,c,0,4); b=rep(b,len-4); c=rep(c,4); } //在万以内 if(len<=4) { c=new char[len]; Array.Copy(s1,0,c,0,len); c=rep(c,len); } if(c!=null && c.Length>0) { //加单位 int j=3; for(int i=c.Length-1;i>=0;i--) { if(c.Length==1&&c[c.Length-1]=='零') { break; } if(c[i]!='零') { box1=c[i].ToString()+R1[j]+box1; } else { box1=R1[j]+box1; } j--; } } if(b!=null &&b.Length>0) { //加单位 int j=3; for(int i=b.Length-1;i>=0;i--) { if(b[i]!='零') { if(i==b.Length-1) { box2=b[i].ToString()+box2; } else { box2=b[i].ToString()+R1[j]+box2; } } j--; } box2=box2+"万"; } if(a!=null && a.Length>0) { //加单位 int j=3; for(int i=a.Length-1;i>=0;i--) { if(a[i]!='零') { if(i==a.Length-1) { box3=a[i].ToString()+box3; } else { box3=a[i].ToString()+R1[j]+box3; } } j--; } box3=box3+"亿"; } //处理小数数部分 //替换数字 s2=rep(s2,len2); string box4=""; for(int i=0;i<len2;i++) { if(i<=1) { box4=box4 +s2[i].ToString()+R2[i]; } } box=box3+box2+box1+box4; return box; }//dowork private char [] rep(char []s1,int len) { //替换数字 for(int i=0;i<len;i++) { switch(s1[i]) { case '0': s1[i]='零'; break; case '1': s1[i]='壹'; break; case '2': s1[i]='贰'; break; case '3': s1[i]='叁'; break; case '4': s1[i]='肆'; break; case '5': s1[i]='伍'; break; case '6': s1[i]='陆'; break; case '7': s1[i]='柒'; break; case '8': s1[i]='捌'; break; case '9': s1[i]='玖'; break; } }//for return s1; } C#执行映射磁盘内脚本文件问题 自定义的控件如何通过bindingSource数据源的绑定某一属性 窗体传值 未将对象初始化 C#怎么实现TCP协议的PING功能现在很多机房都封了PING功能的 VS2005自定义控件 dataset问题!急!~~~~ excel导出中奇怪的问题。 冰天雪地赤裸上身跪问菜鸟问题 string.Format 补长遇到汉字怎么办? CForce() 兄来领分吧!呵呵!谢谢了! 请问win xp+sp2中自己设置的还原点的文件被系统放在那里了呀? 能否程序控制IIS回收(我知道可以自动回收,但需要用程序控制)。
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();
}
}
}
{
Application.Run(new Form1());
} private void Form1_Load(object sender, System.EventArgs e)
{
this.textBox1.Text="12,789,24.01";
this.textBox2.Text="";
} private void button1_Click(object sender, System.EventArgs e)
{
string s=this.textBox1.Text.Trim();
s=s.Replace(",","");
//有无 " ."
if(s.IndexOf(".")==-1)
{
s=s+".00";
}
string []a=s.Split('.');
//存放结果
char []m=a[0].ToCharArray();
char []n=a[1].ToCharArray(); string box=dowork(m,n);
this.textBox2.Text=box+"整";
}
private string dowork(char [] s1,char []s2) { string [] R1=new string[]{"仟","佰","拾","元"};//长度为4
string [] R2=new string[]{"角","分"};//长度为2
//处理整数部分
int len=s1.Length;
int len2=s2.Length; string box="";
string box1="";
string box2="";
string box3="";
char []a=null;
char []b=null;
char []c=null; //是否过亿
if(len>=9)
{
a=new char[len-8];
b=new char[4];
c=new char[4];
Array.Copy(s1,0,a,0,len-8);
Array.Copy(s1,len-8,b,0,4);
Array.Copy(s1,len-4,c,0,4);
a=rep(a,len-8);
b=rep(b,4);
c=rep(c,4); } //是否过万
if(len>=5 &&len<=8)
{
b=new char[len-4];
c=new char[4];
Array.Copy(s1,0,b,0,len-4);
Array.Copy(s1,len-4,c,0,4);
b=rep(b,len-4);
c=rep(c,4);
}
//在万以内
if(len<=4)
{
c=new char[len];
Array.Copy(s1,0,c,0,len);
c=rep(c,len);
}
if(c!=null && c.Length>0)
{
//加单位
int j=3;
for(int i=c.Length-1;i>=0;i--) {
if(c.Length==1&&c[c.Length-1]=='零')
{
break;
} if(c[i]!='零')
{
box1=c[i].ToString()+R1[j]+box1;
}
else
{
box1=R1[j]+box1;
}
j--;
}
}
if(b!=null &&b.Length>0)
{
//加单位
int j=3;
for(int i=b.Length-1;i>=0;i--) {
if(b[i]!='零')
{
if(i==b.Length-1)
{
box2=b[i].ToString()+box2;
}
else
{
box2=b[i].ToString()+R1[j]+box2;
}
}
j--;
}
box2=box2+"万"; }
if(a!=null && a.Length>0)
{
//加单位
int j=3;
for(int i=a.Length-1;i>=0;i--) {
if(a[i]!='零')
{
if(i==a.Length-1)
{
box3=a[i].ToString()+box3;
}
else
{
box3=a[i].ToString()+R1[j]+box3;
}
}
j--;
}
box3=box3+"亿"; }
//处理小数数部分
//替换数字
s2=rep(s2,len2);
string box4="";
for(int i=0;i<len2;i++) {
if(i<=1)
{
box4=box4 +s2[i].ToString()+R2[i];
}
}
box=box3+box2+box1+box4;
return box;
}//dowork
private char [] rep(char []s1,int len)
{
//替换数字
for(int i=0;i<len;i++)
{
switch(s1[i])
{
case '0':
s1[i]='零';
break;
case '1':
s1[i]='壹';
break;
case '2':
s1[i]='贰';
break;
case '3':
s1[i]='叁';
break;
case '4':
s1[i]='肆';
break;
case '5':
s1[i]='伍';
break;
case '6':
s1[i]='陆';
break;
case '7':
s1[i]='柒';
break;
case '8':
s1[i]='捌';
break;
case '9':
s1[i]='玖';
break;
} }//for
return s1;
}