转换数字为大写RMB金额

        花了很长时间写了一个转换数字为大写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   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值