1
using System;
2
using System.Collections;
3
using System.IO;
4
using System.Text;
5
6
/**/
7
/// <summary>
8
/// 用于将一个数值型转化为汉语的读法.
9
/// </summary>
10
public class NumberToChn
11
{
12
public NumberToChn()
13
{
14
//
15
// TODO: 在此处添加构造函数逻辑
16
//
17
}
18
19
public static string GetChn(decimal dc, bool bUpper)
20
{
21
return GetChn(dc.ToString(), bUpper);
22
}
23
24
public static string GetChn(int i, bool bUpper)
25
{
26
return GetChn(i.ToString(), bUpper);
27
}
28
29
public static string GetChn(long l, bool bUpper)
30
{
31
return GetChn(l.ToString(), bUpper);
32
}
33
34
public static string GetRMBChn(string sDigital, bool bUpper)
35
{
36
// 找出第一个点所在的位置,之前的部分用getchn来处理,之后的部分自已处理.
37
if (sDigital == null | sDigital.Length == 0)
38
return "";
39
40
int iIndex = sDigital.IndexOf(".");
41
string sIntPart;
42
string sDecPart;
43
if (iIndex == -1)
44
{
45
sIntPart = sDigital;
46
sDecPart = "";
47
}
48
else
49
{
50
sIntPart = sDigital.Substring(0, iIndex);
51
sDecPart = sDigital.Substring(iIndex + 1);
52
}
53
54
StringBuilder sb = new StringBuilder(sDigital.Length * 2 + 10);
55
foreach (char c in sDecPart)
56
{
57
if (char.IsDigit(c))
58
{
59
sb.Append(c);
60
}
61
}
62
sDecPart = sb.ToString();
63
sb.Length = 0;
64
65
string sTmp = GetChn(sIntPart, bUpper);
66
if (sTmp != "零" && sTmp.Length != 0)
67
{
68
sb.Append(sTmp);
69
sb.Append(bUpper ? '圆' : '元');
70
}
71
72
bool bPrevIsZero = false;
73
if (sIntPart.Length > 0 && sIntPart.EndsWith("0") && sb.Length > 1)
74
{
75
bPrevIsZero = true;
76
}
77
for (int i = 0; i < sDecPart.Length && i < arRMBRight.Length; i++)
78
{
79
if (sDecPart[i] == '0')
80
{
81
bPrevIsZero = true;
82
}
83
else
84
{
85
if (bPrevIsZero == true)
86
{
87
sb.Append('零');
88
bPrevIsZero = false;
89
}
90
sb.Append(bUpper ? arDigitals2[sDecPart[i] - '0'] : arDigitals[sDecPart[i] - '0']);
91
sb.Append(arRMBRight[i]);
92
}
93
}
94
if (sb.Length > 0)
95
{
96
sb.Append('整');
97
}
98
else
99
{
100
sb.Append(bUpper ? "零圆整" : "零元整");
101
}
102
return sb.ToString();
103
}
104
105
public static string GetChn(string s, bool bUpper)
106
{
107
// 先将s过滤,删除所有的非数字字符。
108
if (s == null || s.Trim().Length == 0)
109
return "";
110
StringBuilder sb = new StringBuilder(s.Length);
111
int iPointCount = 0;
112
for (int i = 0; i < s.Length; i++)
113
{
114
char c = s[i];
115
if (Char.IsDigit(c))
116
{
117
sb.Append(c);
118
}
119
else if (c == '.')
120
{
121
// 如果是第二个之后的点,那么不管了。
122
if (iPointCount == 0)
123
{
124
sb.Append(c);
125
iPointCount++;
126
}
127
}
128
else if (c == '-' && i == 0)
129
{
130
sb.Append(c);
131
}
132
else
133
{
134
// 剩下的全部忽略
135
}
136
}
137
138
string sDigital = sb.ToString();
139
if (sDigital.EndsWith("."))
140
{
141
sDigital = sDigital.Substring(0, sDigital.Length - 1);
142
}
143
if (sDigital.Length == 0)
144
{
145
sDigital = "0";
146
}
147
148
sb.Length = 0; // 留为后用。
149
150
// 从小数点前后分为两部分
151
int iTmp = sDigital.IndexOf('.');
152
string sIntPart;
153
string sDecimalPart;
154
if (iTmp == -1)
155
{
156
sIntPart = sDigital;
157
sDecimalPart = "";
158
}
159
else
160
{
161
sIntPart = sDigital.Substring(0, iTmp);
162
sDecimalPart = sDigital.Substring(iTmp + 1);
163
}
164
165
// 处理小数点之前的部分
166
167
// 先决定最高位是什么位,再依次地向后拼出。
168
// 大循环是亿的个数, 小循环是万的个数。
169
170
sb = new StringBuilder(sDigital.Length * 2 + 6);
171
if (sDigital.StartsWith("-"))
172
{
173
sb.Append("负");
174
sIntPart = sIntPart.Substring(1);
175
}
176
// 如果小数点之后没有内容,之前部分又是空,那么不输出.
177
if (sIntPart.Length == 0 && sDecimalPart.Length == 0)
178
{
179
return "";
180
}
181
182
int iBitCntInWan = 0;
183
bool bPrevIs0 = false;
184
int iWanNotZeroCnt = 0;
185
int iNotZeroCnt = 0;
186
187
for (int i = 0; i < sIntPart.Length; i++)
188
{
189
int iBitCnt = sIntPart.Length - i - 1;
190
191
char cNum = sIntPart[i];
192
if (cNum == '0')
193
{
194
// 如果是零,那么不处理
195
bPrevIs0 = true;
196
}
197
else
198
{
199
if (bPrevIs0)
200
{
201
// 如果上一个是0
202
if (iNotZeroCnt > 0)
203
{
204
//如果不是第一个字 那么加一个零字
205
sb.Append(bUpper ? arDigitals2[0] : arDigitals[0]);
206
}
207
}
208
iWanNotZeroCnt++;
209
iNotZeroCnt++;
210
211
bPrevIs0 = false;
212
sb.Append(bUpper ? arDigitals2[cNum - '0'] : arDigitals[cNum - '0']); // 加数名
213
iBitCntInWan = iBitCnt % 4;
214
if (iBitCntInWan != 0)
215
{
216
sb.Append(bUpper ? arRights2[iBitCntInWan] : arRights[iBitCntInWan]); // 加权名
217
}
218
}
219
220
if (iBitCnt % 8 == 0)
221
{
222
// 遇亿的处理
223
if (iBitCnt / 8 >= 1 && iNotZeroCnt > 0)
224
sb.Append('亿');
225
bPrevIs0 = false;
226
iWanNotZeroCnt = 0;
227
}
228
else if (iBitCnt % 4 == 0)
229
{
230
// 遇万位的处理
231
if ((iBitCnt % 8) / 4 >= 1 && iWanNotZeroCnt > 0)
232
{
233
sb.Append('万');
234
}
235
bPrevIs0 = false;
236
iWanNotZeroCnt = 0;
237
}
238
}
239
240
241
// 如果全部都是0,那么输出一个"零".
242
if (iNotZeroCnt == 0)
243
{
244
sb.Append("零");
245
}
246
247
// 处理小数点之后的部分
248
if (sDecimalPart.Length != 0)
249
{
250
sb.Append("点");
251
for (int i = 0; i < sDecimalPart.Length; i++)
252
{
253
sb.Append(bUpper ? arDigitals2[sDecimalPart[i] - '0'] : arDigitals[sDecimalPart[i] - '0']);
254
}
255
}
256
iTmp = 0;
257
if (sb[0] == '负')
258
{
259
iTmp = 1;
260
}
261
262
// 把起头的"一十"改为"拾".
263
if (sb.Length >= 2)
264
{
265
if (sb[iTmp] == (bUpper ? arDigitals2[1] : arDigitals[1]) &&
266
sb[iTmp + 1] == (bUpper ? arRights2[1] : arRights[1]))
267
{
268
sb.Remove(iTmp, 1);
269
}
270
}
271
return sb.ToString();
272
}
273
274
private static char[] arRights = { ' ', '十', '百', '千' }; // 权名
275
private static char[] arRights2 = { ' ', '拾', '佰', '仟' }; // 权名
276
private static char[] arDigitals = {
277
'零','一','二','三','四','五','六','七','八','九'
278
};
279
private static char[] arDigitals2 = {
280
'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
281
};
282
private static char[] arRMBRight = { '角', '分', '厘', '毫', '丝' };
283
284
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284