java的BigDecimal数变为中文大写

public class BigDecimalToChineseUtil {

    private static final String[] CHINESE_NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    private static final String[] UNITS = {"", "拾", "佰", "仟"};
    private static final String[] BIG_UNITS = {"", "万", "亿", "兆", "京", "垓", "秭", "穰", "沟", "涧", "正", "载", "极"}; // 根据需要可以增加更多大单位

    public static String convertToChinese(BigDecimal price) {
        if (price == null || price.compareTo(BigDecimal.ZERO) < 0) {
            throw new IllegalArgumentException("价格不能为空或小于0");
        }

        // 转换为字符串并截取小数点前后部分
        String priceStr = price.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString();
        String integerPart = priceStr.split("\\.")[0]; // 整数部分
        String decimalPart = priceStr.split("\\.")[1]; // 小数部分(角、分)

        // 处理整数部分
        String integerChinese = convertToChinesePart(integerPart, UNITS, BIG_UNITS);

        // 处理小数部分
        String decimalChinese = "";
        if (!"00".equals(decimalPart)) {
            decimalChinese = convertToDecimalChinese(decimalPart);
        }

        // 合并结果
        return integerChinese + "元" + decimalChinese;
    }

    private static String convertToChinesePart(String numberStr, String[] units, String[] bigUnits) {
        if ("0".equals(numberStr)) {
            return CHINESE_NUMBERS[0];
        }

        StringBuilder sb = new StringBuilder();
        int unitIndex = 0;
//        int zeroCount = 0;

        for (int i = numberStr.length() - 1; i >= 0; i--) {
            int digit = numberStr.charAt(i) - '0';
            String chineseDigit = CHINESE_NUMBERS[digit];

            if (digit == 0) {
//                zeroCount++;
                // 连续零的处理:只在非零数字后面、单位变化处或字符串开始处添加一个零
                if (sb.length() > 0 && (sb.charAt(sb.length() - 1) != CHINESE_NUMBERS[0].charAt(0) || unitIndex == 0 || i == 0)) {
                    sb.insert(0, chineseDigit);
                }
            } else {
                // 添加非零数字和对应单位
                sb.insert(0, chineseDigit + units[unitIndex]);
//                zeroCount = 0; // 重置连续零的计数
            }

            // 切换到下一个单位
            if (++unitIndex == units.length) {
                unitIndex = 0; // 循环使用单位数组
                if (sb.length() > 0 && i > 0) {
                    sb.insert(0, bigUnits[(numberStr.length()-i) / units.length]);
                }
            }
        }

        // 去除末尾可能多余的零
        while (sb.length() > 0 && sb.charAt(0) == CHINESE_NUMBERS[0].charAt(0)) {
            sb.deleteCharAt(0);
        }

        return sb.toString();
    }

    private static String convertToDecimalChinese(String decimalPart) {
        StringBuilder sb = new StringBuilder();
        if (decimalPart.charAt(0) != '0') {
            sb.append(CHINESE_NUMBERS[decimalPart.charAt(0) - '0']).append("角");
        }
        if (decimalPart.length() > 1 && decimalPart.charAt(1) != '0') {
            sb.append(CHINESE_NUMBERS[decimalPart.charAt(1) - '0']).append("分");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        BigDecimal amount = new BigDecimal("12345678901.23");
        //System.out.println(convertToChinese(amount)); // 壹佰贰拾叁亿肆仟伍佰陆拾柒万捌仟玖佰零壹元贰角叁分

//        amount = new BigDecimal("10010.01");
//        System.out.println(convertToChinese(amount)); // 壹万零壹拾元零壹分
//
//        amount = new BigDecimal("0.01");
//        System.out.println(convertToChinese(amount)); // 壹分

        amount = new BigDecimal("100000000");
        System.out.println(convertToChinese(amount)); // 壹亿元整
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值