这几天刚刚开始学Java,想练练手,写了这个人民币金额大写转换,中文数字大写转换的类。
希望大家指点。
1. /*
2. * Copyright 2008 weijn2000@163.net
3. * ChineseNum类有2个Static方法:
4. * 1、UpperRMB(double money)用于转换符合票据使用的人民币大写金额
5. * 2、UpperNum(double Num,int Precision)用于数字大写
6. */
7.
8. package
9.
10. /**
11. *
12. * @author Gann
13. */
14. public class
15. private static final char[] RMBUNITCHAR ={'分','角','圆','拾','佰','仟','万',
16. '拾','佰','仟','亿','拾','佰','仟','万','拾','佰','仟',
17. };
18. private static final char[] NUMUNITCHAR ={'个','拾','佰','仟','万','拾','佰',
19. '仟','亿','拾','佰','仟','万','拾','佰','仟', //个位数单位不发音
20. };
21. private static final char[] CHINESEDIGIT={
22. '零','壹','贰','叁','肆','伍','陆','柒','捌','玖',
23. };
24.
25. /*
26. * 功能:UpperRMB(double money)将数字转换为人民币大写“圆角分”,符合票据要求
27. * 输入:Double类型 (如:9.45)
28. * 返回:人民币大写字符串 (如:玖圆肆角伍分)
29. * 注意:“角分”部分受double数据类型精度影响。例如数值大于几十万亿时,转换出来的
30. * 第二位小数可能会有点误差,整数部分越小,小数部分精确度越高
31. */
32. public static String UpperRMB(double
33. int
34. String moneystr;
35. new StringBuilder(); //比使用+连接更有效率
36. boolean zeroflag = false; //用于处理数字0
37. boolean unitflag = false; //解决数字中连续的0过多导致单位错误的问题
38.
39. "%.2f",Math.abs(money)); //保留2位小数
40. ".", ""); //消除小数点
41.
42. if(moneystr.length() > RMBUNITCHAR.length){
43. return "数值超出范围";
44. }
45. if(moneystr.equals("000")){
46. return "零圆整";
47. }
48.
49. for(i = 0;i<moneystr.length();i++){ //逐位转换
50. if(moneystr.charAt(i) != '0'){ //处理非0数字
51. if(!zeroflag){ //此数字前一位不为0,直接转换为大写数字
52. '0']);
53. 1-i]);
54. }
55. else{ //前面有零则加上“零”
56. 0]);
57. '0']);
58. 1-i]);
59. }
60. false; //读到非零数字,清除零标志
61. false;
62. }
63. else{ //处理0数字
64. if(i==0){ //整数部分为0,跳过
65. if(moneystr.charAt(i+1) == '0'){ //跳过零圆零角
66. i++;
67. }
68. continue;
69. }
70. /*解决数字中间0太多时出现的问题:100000000010正确:壹仟亿零壹拾圆整
71. *防止出现 “壹仟亿万零壹拾圆整” 等情况*/
72. if(((!unitflag) &&((moneystr.length()-1-i) == 6)) //万
73. 1-i) == 2) //圆
74. 1-i) == 10) //亿
75. 1-i) == 14)){ //万(亿)
76. 1-i]);
77. true; //解决0连续跨上述单位引起的问题
78. }
79. true; //表示读到0
80. }
81. }
82. //如果分数字为0,大写数字后面要加上“整”
83. if(moneystr.charAt(moneystr.length()-1)=='0'){
84. "整");
85. }
86. return
87. }
88.
89. /*
90. * 功能:UpperNum(double Num,int Precision)将数字转换为中文大写形式
91. * 输入:Num为需要大写的实数,Precision为精度位数(如:(9.453,2))
92. * 返回:为中文大写字符串(如:玖点肆伍)。
93. * 注意:小数部分受double数据类型精度影响。例如数值大于几十万亿时,转换出来的
94. * 第二位小数可能会有点误差,整数部分越小,小数部分精确度越高
95. */
96. public static String UpperNum(double Num,int
97. int
98. String numstr;
99. new StringBuilder(); //比使用+连接更有效率
100. boolean zeroflag = false; //用于处理数字0
101. boolean unitflag = false; //解决数字中连续的0过多导致单位错误的问题
102. boolean dotflag = false; //判断读到小数点与否
103.
104. 0 ? "":"负");
105. if(Precision < 0){ //精度值要确保大于等于0
106. "%.2f",Math.abs(Num));
107. }
108. else{
109. "%." + Precision + "f",Math.abs(Num));
110. }
111. "."); //获取小数点位置
112. if(dotpos < 0){ //没有小数点,表示为整数
113. dotpos = numstr.length();
114. }
115.
116. if(dotpos > NUMUNITCHAR.length){
117. return "数值超出范围";
118. }
119.
120. for(i = 0;i<numstr.length();i++){ //开始逐位处理
121. if(numstr.charAt(i) == '.'){ //判断是否为小数点
122. "点");
123. true;
124. continue;
125. }
126.
127. if(dotflag){ //小数点后面部分数字
128. '0']);
129. continue;
130. }
131.
132. //小数点前面部分
133. if(numstr.charAt(i) != '0'){ //处理非0数字
134. if(!zeroflag){ //此数字前一位不为0,直接转换为大写数字
135. '0']);
136. 1
137. }
138. else{ //前面有零则加上“零”
139. 0]);
140. '0']);
141. 1
142. }
143. false; //读到非零数字,清除零标志
144. false;
145. }
146. else{ //处理0数字
147. if(i==0){ //整数部分为0
148. "零");
149. }
150. /*解决数字中间0太多时出现的问题:100000000010正确:壹仟亿零壹拾
151. *防止出现 “壹仟亿万零壹拾” 等情况*/
152. if(((!unitflag) &&(((dotpos - i) == 5))) //万
153. 9) //亿
154. 13)){ //万(亿)
155. 1
156. true; //解决0连续跨上述单位引起的问题
157. }
158. true; //表示读到0
159. }
160. }
161.
162. return resultstr.toString().replace("个", "");//删除个位数的单位
163. }
164. }
165.