人民币大小写转换工具类

package com.test.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public final class ChangeRMB {

    // 每个数字对应的大写
    private static final String[] num = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
	    "柒", "捌", "玖", };

    // 从低到高排列的单位
    private static final String[] bit = { "圆", "拾", "佰", "仟", "万", "拾", "佰",
	    "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" };

    // 金额里面的角和分
    private static final String[] jf = { "角", "分" };

    /**
     * 处理金额的整数部分,返回"...圆整"
     * 
     * @param integer
     * @return String
     * @throws Exception
     */
    public static String praseUpcaseRMB(String integer) throws Exception {
	StringBuilder sbdr = new StringBuilder("");
	int j = integer.length();
	if (j > bit.length) {
	    throw new Exception("\n只能处理亿万亿以内的数据(含亿万亿)!");
	}
	char[] rmb = integer.toCharArray();
	for (int i = 0; i < rmb.length; i++) {
	    int numLocate = Integer.parseInt("" + rmb[i]); // 大写数字位置
	    int bitLocate = j - 1 - i; // 数字单位的位置
	    /*
	     * 连续大写零只添加一个
	     */
	    if (numLocate == 0) {
		if (!sbdr.toString().endsWith(num[0])) {
		    sbdr.append(num[numLocate]);
		}
		continue;
	    }
	    /*
	     * 下面的if语句保证 10065004583.05-->壹佰亿陆仟伍佰万肆仟伍佰捌拾叁圆零伍分
	     */
	    if (bit[bitLocate].equals("仟")) {
		String s = sbdr.toString();
		if (!s.endsWith(bit[bitLocate + 1]) && s.length() > 0) {
		    if (s.endsWith(num[0])) {
			sbdr.deleteCharAt(sbdr.length() - 1);
		    }
		    sbdr.append(bit[bitLocate + 1]);
		}
	    }
	    sbdr.append(num[numLocate]);
	    sbdr.append(bit[bitLocate]);
	}// end for
	/*
	 * 去掉结尾"零"后,补全
	 */
	if (sbdr.toString().endsWith(num[0])) {
	    sbdr.deleteCharAt(sbdr.length() - 1);
	    sbdr.append("圆整");
	} else {
	    sbdr.append("整");
	}
	return sbdr.toString();
    }

    /**
     * 处理带小数的金额,整数部分交由上一个方法处理,小数部分自己处理
     * 
     * @param integer
     * @param decimal
     * @return String
     * @throws Exception
     */
    public static String praseUpcaseRMB(String integer, String decimal)
	    throws Exception {
	String ret = ChangeRMB.praseUpcaseRMB(integer);
	ret = ret.split("整")[0]; // 处理整数部分
	StringBuilder sbdr = new StringBuilder("");
	sbdr.append(ret);
	char[] rmbjf = decimal.toCharArray();
	for (int i = 0; i < rmbjf.length; i++) {
	    int locate = Integer.parseInt("" + rmbjf[i]);
	    if (locate == 0) {
		if (!sbdr.toString().endsWith(num[0])) {
		    sbdr.append(num[locate]);
		}
		continue;
	    }
	    sbdr.append(num[locate]);
	    sbdr.append(jf[i]);
	}
	return sbdr.toString();
    }

    /**
     * 将double形式的字符串(有两位小数或无小数)转换成人民币的大写格式
     * 
     * @param doubleStr
     * @return String
     * @throws Exception
     */
    public static String doChangeRMB(String doubleStr) throws Exception {
	String result = null;
	if (doubleStr.contains(".")) { // 金额带小数
	    int dotloc = doubleStr.indexOf(".");
	    int strlen = doubleStr.length();
	    String integer = doubleStr.substring(0, dotloc);
	    String decimal = doubleStr.substring(dotloc + 1, strlen);
	    result = ChangeRMB.praseUpcaseRMB(integer, decimal);
	} else { // 金额是整数
	    String integer = doubleStr;
	    result = ChangeRMB.praseUpcaseRMB(integer);
	}
	return result;
    }

    /**
     * 将double数值(有两位小数或无小数)转换成人民币的大写格式
     * 
     * @param rmbDouble
     * @return String
     * @throws Exception
     */
    public static String doChangeRMB(double rmbDouble) throws Exception {
	String result = null;
	double theInt = Math.rint(rmbDouble);
	if (theInt > rmbDouble) {
	    theInt -= 1;
	}
	double theDecimal = rmbDouble - theInt;
	String integer = new Long((long) theInt).toString();
	String decimal = "" + Math.round(theDecimal * 100);
	if (decimal.equals("0")) {
	    result = ChangeRMB.praseUpcaseRMB(integer);
	} else {
	    result = ChangeRMB.praseUpcaseRMB(integer, decimal);
	}
	return result;
    }

    public static void main(String[] args) throws Exception {
	System.out.print("输入小写人民币金额:");
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	String in = br.readLine();
	String result = ChangeRMB.doChangeRMB(in);
	System.out.println("\n" + "------------转换结果------------");
	System.out.println(result);
	double d = 54628569856.68;
	String ret = ChangeRMB.doChangeRMB(d);
	System.out.println("\n" + "------------转换结果------------");
	System.out.println(ret);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值