1 publicclassTrans2RMB {
2 
3 /**
4 * 测试程序的可行性
5 *@paramargs
6 */
7 publicstaticvoidmain(String[] args) {
8 System.out.println("\n--------将数字转换成中文金额的大写形式------------\n");
9 Trans2RMB t2r=newTrans2RMB();
10 String s=t2r.cleanZero(t2r.splitNum(t2r.roundString(t2r.getNum())));
11 //如果转换过后是一个空串,则不输出屏幕
12 if(!"".equals(s)) {
13 System.out.println("转换成中文后为:"+s);;
14 }
15 System.out.println("\n---------------------------------------------");
16 }
17 
18 /**
19 * 从命令行接收一个数,在其中调用 checkNum() 方法对其进行
20 * 验证,并返回相应的值
21 *@return如果输入合法,返回输入的这个数
22 */
23 privateString getNum() {
24 String s=null;25 System.out.println("请输入一个数字(精确到小数点后两位):");
26 //从命令行输入这个浮点数27 java.util.Scanner scanner=newjava.util.Scanner(System.in);
28 s=scanner.next();29 //关闭这个Scanner30 scanner.close();31 //判断用户输入是否合法
32 //若合法,返回这个值;若非法返回 "0"33 if(this.checkNum(s)) {34 returns;35 }else{36 return"";
37 }38 }39 40 /**41 * 判断用户输入的数据是否合法,用户只能输入大于零的数字,不能输入其它字符
42 *@params String43 *@return如果用户输入数据合法,返回 true,否则返回 false44 */45 privatebooleancheckNum(String s) {
46 //如果用户输入的数里有非数字字符,则视为非法数据,返回 false47 try{48 floatf=Float.valueOf(s);49 //如果这个数小于零则视为非法数据,返回 false
50 if(f<0) {51 System.out.println("非法数据,请检查!");52 returnfalse;53 }else{54 returntrue;55 }56 }catch(NumberFormatException e) {
57 System.out.println("非法数据,请检查!");58 returnfalse;59 }60 }61 
62 /**63 * 把用户输入的数以小数点为界分割开来,并调用 numFormat() 方法
64 * 进行相应的中文金额大写形式的转换65 * 注:传入的这个数应该是经过 roundString() 方法进行了四舍五入操作的66 *@params String
67 *@return转换好的中文金额大写形式的字符串68 */69 privateString splitNum(String s) {70 //如果传入的是空串则继续返回空串
71 if("".equals(s)) {72 return"";73 }74 //以小数点为界分割这个字符串75 intindex=s.indexOf(".");76 //截取并转换这个数的整数部分
77 String intOnly=s.substring(0, index);78 String part1=this.numFormat(1, intOnly);79 //截取并转换这个数的小数部分
80 String smallOnly=s.substring(index+1);81 String part2=this.numFormat(2, smallOnly);
82 //把转换好了的整数部分和小数部分重新拼凑一个新的字符串83 String newS=part1+part2;84 returnnewS;85 }86 87 /**88 * 对传入的数进行四舍五入操作
89 *@params String 从命令行输入的那个数90 *@return四舍五入后的新值91 */92 privateString roundString(String s) {
93 //如果传入的是空串则继续返回空串94 if("".equals(s)) {95 return"";96 }97 //将这个数转换成 double 类型,并对其进行四舍五入操作
98 doubled=Double.parseDouble(s);99 //此操作作用在小数点后两位上100 d=(d*100+0.5)/100;
101 //将 d 进行格式化102 s=newjava.text.DecimalFormat("##0.000").format(d);
103 //以小数点为界分割这个字符串104 intindex=s.indexOf(".");105 //这个数的整数部分
106 String intOnly=s.substring(0, index);107 //规定数值的最大长度只能到万亿单位,否则返回 "0"
108 if(intOnly.length()>13) {109 System.out.println("输入数据过大!(整数部分最多13位!)");
110 return"";111 }112 //这个数的小数部分113 String smallOnly=s.substring(index+1);114 //如果小数部分大于两位,只截取小数点后两位
115 if(smallOnly.length()>2) {116 String roundSmall=smallOnly.substring(0,2);117 //把整数部分和新截取的小数部分重新拼凑这个字符串
118 s=intOnly+"."+roundSmall;119 }120 returns;121 }122 123 /**
124 * 把传入的数转换为中文金额大写形式125 *@paramflag int 标志位,1 表示转换整数部分,0 表示转换小数部分
126 *@params String 要转换的字符串127 *@return转换好的带单位的中文金额大写形式128 */129 privateString numFormat(intflag, String s) {
130 intsLength=s.length();131 //货币大写形式132 String bigLetter[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};133 //货币单位
134 String unit[]={"元","拾","佰","仟","万",135 //拾万位到仟万位136 "拾","佰","仟",137 //亿位到万亿位138 "亿","拾","佰","仟","万"};
139 String small[]={"分","角"};140 //用来存放转换后的新字符串141 String newS="";142 //逐位替换为中文大写形式143 for(inti=0; i