数字金额转大写金额 工具类

数字金额转大写金额 工具类

代码如下:

/*
 * 金额转为汉字大写
 * @return
 * @throws
 * @author TomatoYan
 */
public class NumberToCN {

    /*
    汉字中数字大写
     */
    public static final String[] CN_UPPER_NUMBER_HEAD = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"};
    public static final String[] CN_UPPER_NUMBER_COUNT = {"","元","元","元","","万元","万元","万元","","亿元","亿元","亿元"};
    /*
    汉字中小数点后的大写
     */
    public static final String[] CN_UPPER_NUMBER_TAIL = {"分", "角"};
    /*
    汉字单位大写
     */
    public static final String[] CN_UPPER_MONEY_UNIT = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    /*
    特殊字符:整
     */
    public static final String CN_FULL = "整";
    /*
    特殊字符:零元整
     */
    public static final String CN_ZERO_FULL = "零元" + CN_FULL;

    /*
    将输入的金额转换为对应的汉字大写
     */
    public String changeAmtToCN(String amtStr) {
        String loanAmt = CN_ZERO_FULL;
        if (Double.parseDouble(amtStr) != 0) {
            String[] amtArr = amtStr.split("\\.");
            if (amtArr.length > 1) {
                String amtHead = amtArr[0];
                String amtTail = amtArr[1];
                loanAmt = Double.parseDouble(amtTail) == 0 ? (changeAmtHeadToCN(amtHead) + CN_FULL) : (changeAmtHeadToCN(amtHead) + changeAmtTailToCN(amtTail));
            } else {
                String amtHead = amtArr[0];
                loanAmt = changeAmtHeadToCN(amtHead) + CN_FULL;
            }
        }
        return loanAmt;
    }

    /*
    小数点前
     */
    public String changeAmtHeadToCN(String headStr) {
        StringBuffer sb = new StringBuffer();
        Double head = Double.parseDouble(headStr);
        int count = 0;
        boolean flag = true;
        for (int i = 0; i < headStr.length(); i++) {
            int x = (int) (head % 10);
            if(x==0&&flag) {
                count++;
                head = head / 10;
            }else{
                flag=false;
                sb.append(CN_UPPER_NUMBER_HEAD[i]);
                sb.append(CN_UPPER_MONEY_UNIT[x]);
                head = head / 10;
            }
        }
        return count == 0?sb.reverse().toString():sb.reverse().append(CN_UPPER_NUMBER_COUNT[count]).toString();
    }

    /*
    小数点后
     */
    public String changeAmtTailToCN(String tailStr) {
        StringBuffer sb = new StringBuffer();
        int tail = Integer.parseInt(tailStr);
        for (int i = 0; i < tailStr.length(); i++) {
            int x = tail % 10;
            sb.append(CN_UPPER_NUMBER_TAIL[i]);
            sb.append(CN_UPPER_MONEY_UNIT[x]);
            tail = tail / 10;
        }
        return sb.reverse().toString();
    }

    public static void main(String[] args) {
        String strArr[] = {"1","10","100","1000","10000","100000","1000000","10000000","100000000","1000000000","10000000000","100000000000"};
        for (String str :strArr) {
            System.out.println(str+","+new NumberToCN().changeAmtToCN(str));
        }
    }
}

由于是用数组来控制位数的所以最大支持壹仟亿,由于int值最多为2^32所以,使用了Double来做存储。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值