这几天刚刚开始学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.