金额格式化工具AmtFormat


===================================金额格式化工具

1.金额大写转换

2.金额格式化输出 $200.01 ¥200.01

import java.math.BigDecimal;

public class AmtFormatUtil {
    
    public static int ROUND_HALF_UP = BigDecimal.ROUND_HALF_UP;//四舍五入,舍弃部分如果大于等于5就进位,小于5的直接舍弃
    public static int ROUND_HALF_DOWN = BigDecimal.ROUND_HALF_DOWN;//五舍六入,舍弃部分如果大于5才进位,小于或等于5直接舍弃
    public static int ROUND_HALF_EVEN = BigDecimal.ROUND_HALF_EVEN;
    public static int ROUND_UP = BigDecimal.ROUND_UP;//舍弃部分如果大于等于1,就进位,否则舍弃
    public static int ROUND_DOWN = BigDecimal.ROUND_DOWN;//直接截取,不进位
    public static int ROUND_FLOOR = BigDecimal.ROUND_FLOOR;
    public static int ROUND_CEILING = BigDecimal.ROUND_CEILING;
    public static int ROUND_UNNECESSARY = BigDecimal.ROUND_UNNECESSARY;
    // 金额单位枚举值
    private static final String UNIT[] = { "万", "仟", "佰", "拾", "亿", "仟", "佰", "拾", "万", "仟", "佰", "拾", "元", "角", "分" };
    // 金额大写
    private static final String NUM[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
    
    /**
     * 金额格式化(保留两位小数,且最后一位四舍五入)
     * @param amtDeci
     * @return
     */
    public static String format(BigDecimal amtDeci) {
        BigDecimal outputDeci = amtDeci.setScale(2, ROUND_HALF_UP);
        return outputDeci.toString();
    }
    
    /**
     * 金额格式化
     * @param amtDeci
     * @param unitMode
     * @return
     */
    public static String format(BigDecimal amtDeci, int scale, int roundingMode, String unitMode) {
        BigDecimal outputDeci = amtDeci.setScale(scale, roundingMode);
        return new StringBuffer(unitMode).append(outputDeci.toString()).toString();
    }
    
    /**
     * 将金额小数转换成中文大写金额(小数最多保留两位)
     * @param amtDeci
     * @return
     */
    public static String formatToChina(BigDecimal amtDeci) {
        //换算以分为单位,最后一位四舍五入
        BigDecimal multiply = amtDeci.setScale(2, ROUND_HALF_UP);
        BigDecimal moneyDeci = multiply.multiply(new BigDecimal(100));
        //大写转换
        if (moneyDeci.longValue() == 0) {
            return "零元整";
        }
        String moneyStr = String.valueOf(moneyDeci.longValue());
        int numIndex = 0; // numIndex用于选择金额数值
        int unitIndex = UNIT.length - moneyStr.length(); // unitIndex用于选择金额单位
        boolean isZero = false; // 用于判断当前为是否为零
        String result = "";
        for (; numIndex < moneyStr.length(); numIndex++, unitIndex++) {
            char num = moneyStr.charAt(numIndex);
            if (num == '0') {
                isZero = true;
                if (UNIT[unitIndex] == "亿" || UNIT[unitIndex] == "万" || UNIT[unitIndex] == "元") { // 如果当前位是亿、万、元,且数值为零
                    result = result + UNIT[unitIndex]; // 补单位亿、万、元
                    isZero = false;
                }
            } else {
                if (isZero) {
                    result = result + "零";
                    isZero = false;
                }
                result = result + NUM[Integer.parseInt(String.valueOf(num))] + UNIT[unitIndex];
            }
        }
        // 不是角分结尾就加"整"字
        if (!result.endsWith("角") && !result.endsWith("分")) {
            result = result + "整";
        }
        // 例如没有这行代码,数值"400000001101.2",输出就是"肆千亿万壹千壹佰零壹元贰角"
        result = result.replaceAll("亿万", "亿");
        return result;
    }
}

===================================金额格式化工具测试类

    /**
     * 金额格式化
     */
    @Test
    public void test_format() {
        BigDecimal amtDeci = new BigDecimal(200.016);
        String amtFormat01 = AmtFormatUtil.format(amtDeci, 2, AmtFormatUtil.ROUND_HALF_UP, "¥");
        System.out.println(amtFormat01);
        String amtFormat02 = AmtFormatUtil.format(amtDeci);
        System.out.println(amtFormat02);
    }
    
    /**
     * 金额大写
     */
    @Test
    public void test_formatToChina() {
        String amtFormat = AmtFormatUtil.formatToChina(new BigDecimal(200.01));
        System.out.println(amtFormat);
    }

相关