package com.test; import java.text.NumberFormat; public class Num2RMB { public static void main(String[] args) { System.out.println(toRMB(4506.26)); } public static String toRMB(double n){ String[] unit={"元","拾","佰","仟","万","拾万","佰万","仟万","亿", "拾亿","佰亿","仟亿","万亿","拾万亿","佰万亿","仟万亿","万万亿", "拾万万亿","佰万万亿","仟万万亿","万亿亿"}; String[] unit2={"角","分"}; StringBuilder RMB=new StringBuilder(); NumberFormat nFormat=NumberFormat.getInstance(); nFormat.setGroupingUsed(false); String s=nFormat.format(n); //System.out.println(s); String[] ss=s.split("\\."); //传入的金额整数部分不是0,如果是0就不管它了 if(!ss[0].equals("0")){ int ss0len=ss[0].length(); for(int i=0;i<ss0len;i++) { //当前位到最后一位上不全是0 if( ss[0].substring(i).replace('0', 'a').split("a").length !=0 ) { numUpper(ss[0].charAt(i), RMB); int len=unit[ss0len-i-1].length(); //如果当前位上的数字不为0且单位是大于1位的,如"仟万" if(ss[0].charAt(i)!='0' && len>1 ) { String end=null; if(len==2) { if(unit[ss0len-i-1].substring(1).equals("万")) end="仟"; else end="仟万"; }else if(len==3){ if(unit[ss0len-i-1].substring(1).equals("万亿")) end="仟亿"; else if(unit[ss0len-i-1].substring(1).equals("亿亿")) end="仟万亿"; }else if(len==4){ if(unit[ss0len-i-1].substring(1).equals("万万亿")) end="仟万亿"; } //以 10050000 为例说明以下代码的作用 // 假设现在在"仟万"位上,如果这一位一直到"万"位只要有一个非0的数字,那么1就不能加 // "仟万"了,只能加"仟",比如现在是:“壹仟零伍万元整”。单位是两位的"拾万"、"佰万"也是如此。 // 单位是两位的含"亿"的同理 单位是三位、四位的依次类推 int j=ss0len-i-2; int index=i+1; boolean isAllZero=true; do { if(ss[0].charAt(index)=='0') { index++; j--; }else{ isAllZero=false; break; } } while (!unit[j].equals(end)); if(isAllZero) RMB.append(unit[ss0len-i-1]); else RMB.append(unit[ss0len-i-1].substring(0,1)); }else if(ss[0].charAt(i)!='0'){ //如果当前位上的数字不为0 单位是一位的 RMB.append(unit[ss0len-i-1]); } }else if(i==ss0len-1) { //整数部分到了最后一位了加上"元" RMB.append(unit[0]); } } } if(ss.length==1) //没有角、分的话,最后加上"整" RMB.append("整"); else{ //转换角、分的部分 int ss1len=ss[1].length(); for(int i=0;i<ss1len;i++) { if(i<=1){ numUpper(ss[1].charAt(i), RMB); if(ss[1].charAt(i)!='0') RMB.append(unit2[i]); } } } return RMB.toString(); } /** * 将数字字符转换成大写并加在RMB之后 * @param a 阿拉伯数字字符 * @param RMB StringBuilder */ public static void numUpper(char a,StringBuilder RMB){ String[] num={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; switch (a) { case '1': RMB.append(num[1]); break; case '2': RMB.append(num[2]); break; case '3': RMB.append(num[3]); break; case '4': RMB.append(num[4]); break; case '5': RMB.append(num[5]); break; case '6': RMB.append(num[6]); break; case '7': RMB.append(num[7]); break; case '8': RMB.append(num[8]); break; case '9': RMB.append(num[9]); break; case '0': //如果RMB之后已经有”零“了,就不需要再加”零“ char x=RMB.toString().charAt(RMB.toString().length()-1); if(x!='零' ) RMB.append(num[0]); break; } } }
学到一个知识点就是如果要把 double 转换为 String 时,用 String.valueof(doublke d) ,当d比较大时,变成的String 会用科学计数法表示,比如 System.out.println(String.valueOf(10000000.3)); 输出的结果会是 1.00000003E7 。
这句代码就可以解决这个问题:
NumberFormat nFormat=NumberFormat.getInstance(); nFormat.setGroupingUsed(false); String s=nFormat.format(n);
注意如果没有这句:nFormat.setGroupingUsed(false); 那么数字字符串就会用","隔开,比如 double n= 10000000.3 就会转化成 字符串 10,000,000.3