花了很长时间写了一个转换数字为大写RMB金额的程序,测试了很多数据,应该是没什么太大问题了,不过谁知道还有没有呢?现贴出来:
/**
* Title: <br/>
* Intention: <br/>
* <p>
* Class Name: PACKAGE_NAME.Num2RMB<br/>
* Create Date: 2017/6/29 0029 18:14 <br/>
* Project Name: mikeutils <br/>
* Company: All Rights Reserved. <br/>
* Copyright © 2017 <br/>
* </p>
* <p>
* author: GaoWei <br/>
* 1st_examiner: <br/>
* 2nd_examiner: <br/>
* </p>
*
* @version 1.0
* @since JDK 1.7
*/
import java.text.NumberFormat;
public class Num2RMB {
public static void main(String[] args) {
System.out.println(toRMB(0.01));
System.out.println(toRMB(1));
System.out.println(toRMB(4506.26));
System.out.println(toRMB(100234506.00));
}
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之后已经有”零“了,就不需要再加”零“
if (!"".equals(RMB.toString())) {
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