1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace WindowsFormsApplication1
7 {
8 class numtoUpperString
9 {
10 private readonly char[] chnText;
11 private readonly char[] chnDigit;
12 public numtoUpperString()
13 {
14 chnText = new char[]{'零', '一', '二', '三', '四', '五', '六', '七', '八', '九'};
15 chnDigit = new char[]{'十', '百', '千', '万', '亿'};
16 }
17 public string Convert( string strDigit )
18 {
19 // 检查输入数字
20 decimal dec;
21 try
22 {
23 dec = decimal.Parse( strDigit );
24 }
25 catch( FormatException )
26 {
27 throw new Exception("输入数字的格式不正确。");
28 }
29 catch( Exception e )
30 {
31 throw e;
32 }
33 if( dec <= -10000000000000000m || dec >= 10000000000000000m )
34 {
35 throw new Exception( "输入数字太大或太小,超出范围。" );
36 }
37 StringBuilder strResult = new StringBuilder();
38 // 提取符号部分
39 // '+'在最前
40 if( "+" == strDigit.Substring( 0, 1 ) )
41 {
42 strDigit = strDigit.Substring( 1 );
43 }
44 // '-'在最前
45 else if( "-" == strDigit.Substring( 0, 1 ) )
46 {
47 strResult.Append( '负' );
48 strDigit = strDigit.Substring( 1 );
49 }
50 // '+'在最后
51 else if( "+" == strDigit.Substring( strDigit.Length - 1, 1 ) )
52 {
53 strDigit = strDigit.Substring( 0, strDigit.Length - 1 );
54 }
55 // '-'在最后
56 else if( "-" == strDigit.Substring( strDigit.Length - 1, 1 ) )
57 {
58 strResult.Append( '负' );
59 strDigit = strDigit.Substring( 0, strDigit.Length - 1 );
60 }
61 // 提取整数和小数部分
62 int indexOfPoint;
63 if( -1 == ( indexOfPoint = strDigit.IndexOf('.') ) ) // 如果没有小数部分
64 {
65 strResult.Append( ConvertIntegral( strDigit ) );
66 }
67 else // 有小数部分
68 {
69 // 先转换整数部分
70 if( 0 == indexOfPoint ) // 如果“.”是第一个字符
71 {
72 strResult.Append( '零' );
73 }
74 else
75 {
76 strResult.Append( ConvertIntegral( strDigit.Substring( 0, indexOfPoint ) ) );
77 }
78 // 再转换小数部分
79 if( strDigit.Length - 1 != indexOfPoint ) // 如果“.”不是最后一个字符
80 {
81 strResult.Append( '点');
82 strResult.Append( ConvertFractional( strDigit.Substring( indexOfPoint + 1 ) ) );
83 }
84 }
85 return strResult.ToString();
86 }
87 // 转换整数部分
88 protected string ConvertIntegral(string strIntegral)
89 {
90 // 去掉数字前面所有的'0'
91 // 并把数字分割到字符数组中
92 char[] integral = ( ( long.Parse( strIntegral ) ).ToString() ).ToCharArray();
93 // 变成中文数字并添加中文数位
94 StringBuilder strInt = new StringBuilder();
95 int i;
96 int digit;
97 digit = integral.Length - 1;
98 // 处理最高位到十位的所有数字
99 for( i = 0; i < integral.Length - 1; i++ )
100 {
101 strInt.Append( chnText[ integral[i] - '0'] );
102 if( 0 == digit % 4 ) // '万' 或 '亿'
103 {
104 if( 4 == digit || 12 == digit )
105 {
106 strInt.Append( chnDigit[3] ); // '万'
107 }
108 else if( 8 == digit )
109 {
110 strInt.Append( chnDigit[4] ); // '亿'
111 }
112 }
113 else // '十','百'或'千'
114 {
115 strInt.Append( chnDigit[digit % 4 - 1] );
116 }
117 digit--;
118 }
119 // 如果个位数不是'0'
120 // 或者个位数为‘0’但只有一位数
121 // 则添加相应的中文数字
122 if( '0' != integral[ integral.Length - 1 ] || 1 == integral.Length )
123 {
124 strInt.Append( chnText[ integral[ i ] - '0' ] );
125 }
126
127 // 遍历整个字符串
128 i = 0;
129 while( i < strInt.Length)
130 {
131 int j = i;
132
133 bool bDoSomething = false;
134 // 查找所有相连的“零X”结构
135 while( j < strInt.Length - 1 && "零" == strInt.ToString().Substring( j, 1 ) )
136 {
137 string strTemp = strInt.ToString().Substring( j + 1, 1 );
138
139 // 如果是“零万”或者“零亿”则停止查找
140 if( "万" == strTemp || "亿" == strTemp )
141 {
142 bDoSomething = true;
143 break;
144 }
145 j += 2;
146 }
147 if( j != i) // 如果找到“零X”结构,则全部删除
148 {
149 strInt = strInt.Remove( i, j - i);
150 // 除了在最尾处,或后面不是"零万"或"零亿"的情况下,
151 // 其他处均补入一个“零”
152 if( i <= strInt.Length - 1 && !bDoSomething )
153 {
154 strInt = strInt.Insert( i, '零' );
155 i++;
156 }
157 }
158
159 if( bDoSomething ) // 如果找到"零万"或"零亿"结构
160 {
161 strInt = strInt.Remove( i, 1 ); // 去掉'零'
162 i++;
163 continue;
164 }
165 // 指针每次可移动2位
166 i += 2;
167 }
168 // 遇到“亿万”变成“亿零”或"亿"
169 int index = strInt.ToString().IndexOf( "亿万" );
170 if( -1 != index )
171 {
172 if( strInt.Length - 2 != index && // 如果"亿万"不在最后
173 ( index + 2 < strInt.Length && "零" != strInt.ToString().Substring( index + 2, 1) ) ) // 并且其后没有"零"
174 strInt = strInt.Replace( "亿万", "亿零", index, 2 );
175 else
176 strInt = strInt.Replace( "亿万", "亿", index, 2);
177 }
178 // 开头为“一十”改为“十”
179 if( strInt.Length > 1 && "一十" == strInt.ToString().Substring( 0, 2 ) )
180 {
181 strInt = strInt.Remove( 0, 1 );
182 }
183 return strInt.ToString();
184 }
185 // 转换小数部分
186 protected string ConvertFractional(string strFractional)
187 {
188 char[] fractional = strFractional.ToCharArray();
189 StringBuilder strFrac = new StringBuilder();
190 // 变成中文数字
191 int i;
192 for (i = 0; i < fractional.Length; i++)
193 {
194 strFrac.Append(chnText[fractional[i] - '0']);
195 }
196 return strFrac.ToString();
197 }
198
199 }
200 }