
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

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

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