1 /// <summary>
2 /// 通过数字求金额的大写
3 /// decimal p=123758.21m;
4 /// Response.Write (new CommonFunction().ToUpper(p));
5 /// </summary>
6 /// <param name= "d "> </param>
7 /// <returns> </returns>
8 public static string ToUpper(decimal d)
9 {
10 if (d == 0)
11 return "零元整";
12 string je = d.ToString("####.00");
13 if (je.Length > 15)
14 return "";
15 je = new String('0', 15 - je.Length) + je; //若小于15位长,前面补0
16 string stry = je.Substring(0, 4); //取得 '亿 '单元
17 string strw = je.Substring(4, 4); //取得 '万 '单元
18 string strg = je.Substring(8, 4); //取得 '元 '单元
19 string strf = je.Substring(13, 2); //取得小数部分
20 string str1 = "", str2 = "", str3 = "";
21 str1 = getupper(stry, "亿"); //亿单元的大写
22 str2 = getupper(strw, "万"); //万单元的大写
23 str3 = getupper(strg, "元"); //元单元的大写
24 string str_y = "", str_w = "";
25 if (je[3].ToString() == "0" || je[4].ToString() == "0") //亿和万之间是否有0
26 str_y = "零";
27 if (je[7].ToString() == "0" || je[8].ToString() == "0") //万和元之间是否有0
28 str_w = "零";
29 string ret = str1 + str_y + str2 + str_w + str3; //亿,万,元的三个大写合并
30 for (int i = 0; i < ret.Length; i++) //去掉前面的 "零 "
31 {
32 if (ret[i].ToString() != "零")
33 {
34 ret = ret.Substring(i);
35 break;
36 }
37 }
38 for (int i = ret.Length - 1; i > -1; i--) //去掉最后的 "零 "
39 {
40 if (ret[i].ToString() != "零")
41 {
42 ret = ret.Substring(0, i + 1);
43 break;
44 }
45 }
46 if (ret[ret.Length - 1].ToString() != "元") //若最后不位不是 '元 ',则加一个 '元 '字
47 ret = ret + "元";
48 if (ret == "零零元 ") //若为零元,则去掉 "元数 ",结果只要小数部分
49 ret = "";
50 if (strf == "00") //下面是小数部分的转换
51 {
52 ret = ret + "整";
53 }
54 else
55 {
56 string tmp = "";
57 tmp = getint(strf[0].ToString());
58 if (tmp == "零")
59 ret = ret + tmp;
60 else
61 ret = ret + tmp + "角";
62 tmp = getint(strf[1].ToString());
63 if (tmp == "零")
64 ret = ret + "整";
65 else
66 ret = ret + tmp + "分";
67 }
68 if (ret[0].ToString() == "零")
69 {
70 ret = ret.Substring(1); //防止0.03转为 "零叁分 ",而直接转为 "叁分 "
71 }
72 return ret; //完成,返回
73 }
74 /// <summary>
75 /// 把一个单元转为大写,如亿单元,万单元,个单元
76 /// </summary>
77 /// <param name= "str "> 这个单元的小写数字(4位长,若不足,则前面补零) </param>
78 /// <param name= "strDW "> 亿,万,元 </param>
79 /// <returns> 转换结果 </returns>
80 private static string getupper(string str, string strDW)
81 {
82 if (str == "0000")
83 return "";
84 string ret = "";
85 string tmp1 = getint(str[0].ToString());
86 string tmp2 = getint(str[1].ToString());
87 string tmp3 = getint(str[2].ToString());
88 string tmp4 = getint(str[3].ToString());
89 if (tmp1 != "零")
90 {
91 ret = ret + tmp1 + "仟";
92 }
93 else
94 {
95 ret = ret + tmp1;
96 }
97 if (tmp2 != "零")
98 {
99 ret = ret + tmp2 + "佰";
100 }
101 else
102 {
103 if (tmp1 != "零") //保证若有两个零 '00 ',结果只有一个零,下同
104 ret = ret + tmp2;
105 }
106 if (tmp3 != "零")
107 {
108 ret = ret + tmp3 + "拾";
109 }
110 else
111 {
112 if (tmp2 != "零")
113 ret = ret + tmp3;
114 }
115 if (tmp4 != "零")
116 {
117 ret = ret + tmp4;
118 }
119 if (ret[0].ToString() == "零") //若第一个字符是 '零 ',则去掉
120 ret = ret.Substring(1);
121 if (ret[ret.Length - 1].ToString() == "零") //若最后一个字符是 '零 ',则去掉
122 ret = ret.Substring(0, ret.Length - 1);
123 return ret + strDW; //加上本单元的单位
124 }
125
126 /// <summary>
127 /// 单个数字转为大写
128 /// </summary>
129 /// <param name= "c "> 小写阿拉伯数字 0---9 </param>
130 /// <returns> 大写数字 </returns>
131 private static string getint(string c)
132 {
133 string strMoney = "";
134 switch (c)
135 {
136 case "0":
137 strMoney = "零";
138 break;
139 case "1":
140 strMoney = "壹";
141 break;
142 case "2":
143 strMoney = "贰";
144 break;
145 case "3":
146 strMoney = "叁";
147 break;
148 case "4":
149 strMoney = "肆";
150 break;
151 case "5":
152 strMoney = "伍";
153 break;
154 case "6":
155 strMoney = "陆";
156 break;
157 case "7":
158 strMoney = "柒";
159 break;
160 case "8":
161 strMoney = "捌";
162 break;
163 case "9":
164 strMoney = "玖";
165 break;
166 }
167 return strMoney;
168 }