转换数字为大写RMB金额

        花了很长时间写了一个转换数字为大写RMB金额的程序,测试了很多数据,应该是没什么太大问题了,不过谁知道还有没有呢?现贴出来:
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   

你可能感兴趣的:(String,测试,Class)