您好,欢迎来到年旅网。
搜索
您的当前位置:首页数字转换为大写金额

数字转换为大写金额

来源:年旅网
// 数字转换成大写金额

// 例如:(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 /// 转换后的字符串 12 public static String NumGetStr(Double Num) 13 {

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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务