将数字转换为中文表示

1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
5
namespace ConvertNum2Chinese
6
{
7
class Program
8
{
9
private Dictionary<char, string> _numCharacter;
10
private Dictionary<int, string> _numPosName;
11
private Dictionary<int, string> _numPosName2;
12
13
public Program()
14
{
15
_numCharacter = new Dictionary<char, string>(10);
16
_numCharacter.Add('0', "零");
17
_numCharacter.Add('1', "壹");
18
_numCharacter.Add('2', "贰");
19
_numCharacter.Add('3', "叁");
20
_numCharacter.Add('4', "肆");
21
_numCharacter.Add('5', "伍");
22
_numCharacter.Add('6', "陆");
23
_numCharacter.Add('7', "柒");
24
_numCharacter.Add('8', "扒");
25
_numCharacter.Add('9', "玖");
26
27
_numPosName = new Dictionary<int, string>(4);
28
_numPosName.Add(0, "仟");
29
_numPosName.Add(1, "佰");
30
_numPosName.Add(2, "拾");
31
_numPosName.Add(3, string.Empty);
32
33
_numPosName2 = new Dictionary<int, string>(4);
34
// _numPosName2.Add(-1, "元");
35
_numPosName2.Add(1, string.Empty);
36
_numPosName2.Add(2, "万");
37
_numPosName2.Add(3, "亿");
38
_numPosName2.Add(4, "兆");
39
}
40
41
static void Main(string[] args)
42
{
43
Program p = new Program();
44
45
Display("100000000000", p);
46
Display("99999999.1", p);
47
Display("120012.10", p);
48
Display("0.12", p);
49
Display("0.1211", p);
50
Display("0.00", p);
51
Display("", p);
52
Display("0", p);
53
Display(".0", p);
54
}
55
56
private static void Display(string num, Program p)
57
{
58
Console.WriteLine("Before: " + num);
59
Console.WriteLine("After: " + p.ConvertNum2Chinese(num));
60
Console.WriteLine();
61
}
62
63
public string ConvertNum2Chinese(string num)
64
{
65
int index = num.IndexOf('.');
66
67
StringBuilder leftNum;
68
StringBuilder rightNum;
69
70
if (index == -1)
71
{
72
leftNum = new StringBuilder(num);
73
rightNum = new StringBuilder();
74
}
75
else
76
{
77
leftNum = new StringBuilder(num.Substring(0, index));
78
rightNum = new StringBuilder(num.Substring(index + 1, num.Length - index - 1));
79
}
80
81
string result = string.Empty;
82
83
result += DealLeftNums(leftNum);
84
result += DealRightNums(rightNum);
85
86
if (result.Length == 0)
87
{
88
result = "零元";
89
}
90
91
return result;
92
}
93
94
private StringBuilder DealRightNums(StringBuilder rightNum)
95
{
96
rightNum.Append("00");
97
rightNum.Remove(2, rightNum.Length - 2);
98
99
StringBuilder s = new StringBuilder();
100
101
s.Append(_numCharacter[rightNum[0]]);
102
if (rightNum[0] != '0')
103
{
104
s.Append("角");
105
}
106
107
s.Append(_numCharacter[rightNum[1]]);
108
if (rightNum[1] != '0')
109
{
110
s.Append("分");
111
}
112
113
Deal0Nums(s);
114
115
return s;
116
}
117
118
private StringBuilder DealLeftNums(StringBuilder leftNum)
119
{
120
int a = leftNum.Length % 4;
121
122
for (int i = 0; i < a; i++)
123
{
124
leftNum.Insert(0, '0');
125
}
126
127
int b = leftNum.Length / 4;
128
129
StringBuilder s = new StringBuilder();
130
string leftNumStr = leftNum.ToString();
131
for (int i = 0; i < b; i++)
132
{
133
s.Append(Deal4Num(leftNumStr.Substring(i * 4, 4), _numPosName2[b - i]));
134
}
135
136
if (s.Length > 0)
137
{
138
s.Append("元");
139
}
140
141
Deal0Nums(s);
142
143
return s;
144
}
145
146
private string Deal4Num(string num, string s)
147
{
148
StringBuilder result = new StringBuilder();
149
150
for (int i = 0; i < num.Length; i++)
151
{
152
if (num[i] > '0')
153
{
154
result.Append(_numCharacter[num[i]] + _numPosName[i]);
155
}
156
else
157
{
158
result.Append(_numCharacter[num[i]]);
159
}
160
}
161
162
result.Append(s);
163
164
return result.ToString();
165
}
166
167
private void Deal0Nums(StringBuilder sb)
168
{
169
for (int i = 0; i < sb.Length; i++)
170
{
171
if (sb[i] == '零')
172
{
173
if (i == 0)
174
{
175
sb.Remove(i, 1);
176
Deal0Nums(sb);
177
return;
178
}
179
else if (sb[i - 1] == '零' || i == sb.Length - 1)
180
{
181
sb.Remove(i, 1);
182
i--;
183
}
184
185
if (i < sb.Length - 2 && _numPosName2.ContainsValue(new string(sb[i + 1], 1)))
186
{
187
sb.Remove(i, 1);
188
}
189
190
if (_numPosName2.ContainsValue(new string(sb[i], 1)))
191
{
192
if (_numPosName2.ContainsValue(new string(sb[i - 1], 1)))
193
{
194
sb.Remove(i, 1);
195
}
196
}
197
}
198
else if (sb[i] == '元')
199
{
200
if (sb[i - 1] == '零')
201
{
202
sb.Remove(i - 1, 1);
203
}
204
}
205
}
206
}
207
}
208
}
209
using System;2
using System.Collections.Generic;3
using System.Text;4

5
namespace ConvertNum2Chinese6
{7
class Program8
{9
private Dictionary<char, string> _numCharacter;10
private Dictionary<int, string> _numPosName;11
private Dictionary<int, string> _numPosName2;12

13
public Program()14
{15
_numCharacter = new Dictionary<char, string>(10);16
_numCharacter.Add('0', "零");17
_numCharacter.Add('1', "壹");18
_numCharacter.Add('2', "贰");19
_numCharacter.Add('3', "叁");20
_numCharacter.Add('4', "肆");21
_numCharacter.Add('5', "伍");22
_numCharacter.Add('6', "陆");23
_numCharacter.Add('7', "柒");24
_numCharacter.Add('8', "扒");25
_numCharacter.Add('9', "玖");26

27
_numPosName = new Dictionary<int, string>(4);28
_numPosName.Add(0, "仟");29
_numPosName.Add(1, "佰");30
_numPosName.Add(2, "拾");31
_numPosName.Add(3, string.Empty);32

33
_numPosName2 = new Dictionary<int, string>(4);34
// _numPosName2.Add(-1, "元");35
_numPosName2.Add(1, string.Empty);36
_numPosName2.Add(2, "万");37
_numPosName2.Add(3, "亿");38
_numPosName2.Add(4, "兆");39
}40

41
static void Main(string[] args)42
{43
Program p = new Program();44

45
Display("100000000000", p);46
Display("99999999.1", p);47
Display("120012.10", p);48
Display("0.12", p);49
Display("0.1211", p);50
Display("0.00", p);51
Display("", p);52
Display("0", p);53
Display(".0", p);54
}55

56
private static void Display(string num, Program p)57
{58
Console.WriteLine("Before: " + num);59
Console.WriteLine("After: " + p.ConvertNum2Chinese(num));60
Console.WriteLine();61
}62

63
public string ConvertNum2Chinese(string num)64
{65
int index = num.IndexOf('.');66

67
StringBuilder leftNum;68
StringBuilder rightNum;69

70
if (index == -1)71
{72
leftNum = new StringBuilder(num);73
rightNum = new StringBuilder();74
}75
else76
{77
leftNum = new StringBuilder(num.Substring(0, index));78
rightNum = new StringBuilder(num.Substring(index + 1, num.Length - index - 1));79
}80

81
string result = string.Empty;82

83
result += DealLeftNums(leftNum);84
result += DealRightNums(rightNum);85

86
if (result.Length == 0)87
{88
result = "零元";89
}90

91
return result;92
}93

94
private StringBuilder DealRightNums(StringBuilder rightNum)95
{96
rightNum.Append("00");97
rightNum.Remove(2, rightNum.Length - 2);98

99
StringBuilder s = new StringBuilder();100

101
s.Append(_numCharacter[rightNum[0]]);102
if (rightNum[0] != '0')103
{104
s.Append("角");105
}106

107
s.Append(_numCharacter[rightNum[1]]);108
if (rightNum[1] != '0')109
{110
s.Append("分");111
}112

113
Deal0Nums(s);114

115
return s;116
}117

118
private StringBuilder DealLeftNums(StringBuilder leftNum)119
{120
int a = leftNum.Length % 4;121

122
for (int i = 0; i < a; i++)123
{124
leftNum.Insert(0, '0');125
}126

127
int b = leftNum.Length / 4;128

129
StringBuilder s = new StringBuilder();130
string leftNumStr = leftNum.ToString();131
for (int i = 0; i < b; i++)132
{133
s.Append(Deal4Num(leftNumStr.Substring(i * 4, 4), _numPosName2[b - i]));134
}135

136
if (s.Length > 0)137
{138
s.Append("元");139
}140

141
Deal0Nums(s);142

143
return s;144
}145

146
private string Deal4Num(string num, string s)147
{148
StringBuilder result = new StringBuilder();149

150
for (int i = 0; i < num.Length; i++)151
{152
if (num[i] > '0')153
{154
result.Append(_numCharacter[num[i]] + _numPosName[i]);155
}156
else157
{158
result.Append(_numCharacter[num[i]]);159
}160
}161

162
result.Append(s);163

164
return result.ToString();165
}166

167
private void Deal0Nums(StringBuilder sb)168
{169
for (int i = 0; i < sb.Length; i++)170
{171
if (sb[i] == '零')172
{173
if (i == 0)174
{175
sb.Remove(i, 1);176
Deal0Nums(sb);177
return;178
}179
else if (sb[i - 1] == '零' || i == sb.Length - 1)180
{181
sb.Remove(i, 1);182
i--;183
}184

185
if (i < sb.Length - 2 && _numPosName2.ContainsValue(new string(sb[i + 1], 1)))186
{187
sb.Remove(i, 1);188
}189

190
if (_numPosName2.ContainsValue(new string(sb[i], 1)))191
{192
if (_numPosName2.ContainsValue(new string(sb[i - 1], 1)))193
{194
sb.Remove(i, 1);195
}196
}197
}198
else if (sb[i] == '元')199
{200
if (sb[i - 1] == '零')201
{202
sb.Remove(i - 1, 1);203
}204
}205
}206
}207
}208
}209

将实数转成中文大学金额。如1234.12转成壹仟贰佰叁拾肆元壹角贰分。
实现代码如下:


浙公网安备 33010602011771号