Java金额大写

import java.math.BigDecimal;

/**
 * <h1>金额大写</h1>
 */
public class CapitalAmount {
    /**
     * 汉字大写
     */
    private static final String[] AMOUNT = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    /**
     * 货币单位
     */
    private static final String[] UNIT = {"分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾","佰", "仟"};
    /**
     * 特殊字符
     */
    private static final String[] SPEC = {"整","负"};
    /**
     * 精度
     */
    private static final int ACCURACY = 2;

    /**
     * 输入的金额转换为大写
     * @param amount 金额
     * @return 大写后的金额
     */
    public static String capital(BigDecimal amount){
        StringBuilder sbf = new StringBuilder();
        // 返回-1,0,或1,此BigDecimal的值分类为负,零或正值。
        int whole = amount.signum();
        if(whole == 0){
            // 输入0时返回 零元整
            return sbf.append(AMOUNT[0]).append(UNIT[2]).append(SPEC[0]).toString();
        }
        // 对金额进行四舍五入(向上取整)BigDecimal.ROUND_HALF_UP
        long number = amount.movePointRight(ACCURACY).setScale(0,4).abs().longValue();
        // 获取金额的最后两位
        long scale = number % 100;
        // 解决精度损失问题(将一个long类型强转为int类型会存精度损失,导致数据不对)
        long result;
        // 数字下标
        int numUnit;
        // 单位下标
        int numIndex = 0;
        // 获取零
        boolean getZero = false;
        // 判断最后两位数: 分为四种情况: 00=0, 01=1, 10,11
        if(scale <= 0){
            numIndex = 2;
            number = number/100;
            getZero = true;
        }
        if((scale > 0) && ((scale % 10 <= 0))){
            numIndex = 1;
            number = number / 10;
            getZero = true;
        }
        int zeroSize = 0;
        while(number>0){
            // 每次获取最后一个数
            result = number % 10;
            // 存在精度的损失
            numUnit = (int) result;
            if(numUnit > 0){
                if((numIndex == 9) && (zeroSize >= 3)){
                    // 万
                    sbf.insert(0, UNIT[6]);
                }
                if((numIndex == 13) && (zeroSize >= 3)){
                    // 亿
                    sbf.insert(0, UNIT[10]);
                }
                sbf.insert(0, UNIT[numIndex]);
                sbf.insert(0, AMOUNT[numUnit]);
                getZero = false;
                zeroSize = 0;
            }else {
                ++zeroSize;
                if(!(getZero)){
                    sbf.insert(0, AMOUNT[numUnit]);
                }
                if(numIndex == 2){
                    sbf.insert(0, UNIT[numIndex]);
                }else if(((numIndex - 2)%4 == 0) && (number % 1000 > 0)){
                    sbf.insert(0, UNIT[numIndex]);
                }
                getZero = true;
            }
            // 让number每次都去掉最后一个数
            number = number / 10;
            ++numIndex;
        }
        // 如果whole == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
        if(whole == -1){
            sbf.insert(0, SPEC[1]);
        }
        // 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整
        if(scale <= 0){
            sbf.append(SPEC[0]);
        }
        return sbf.toString();
    }
}

copy

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值