数字金额转成中文金额的工具类

package org.moreyou.modules.api.util;

import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NumberToChinese {

    private static final String[] CN_NUMS = new String[] {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    private static final String[] CN_INT_RADICE = new String[] {"", "拾", "佰", "仟"};
    private static final String[] CN_INT_UNITS = new String[] {"", "万", "亿", "兆"};
    private static final String[] CN_DEC_UNITS = new String[] {"角", "分", "毫", "厘"};
    private static final String CN_INTEGER = "整";
    private static final String CN_INT_LAST = "元";

    public static String convertToChinese(BigDecimal money) {
        StringBuilder ChineseStr = new StringBuilder(); // 输出的中文金额字符串
        if (money.compareTo(BigDecimal.ZERO) == 0) {
            return CN_NUMS[0] + CN_INT_LAST + CN_INTEGER;
        }
        if (money.compareTo(BigDecimal.valueOf(999999999999999.9999)) >= 0) {
            throw new IllegalArgumentException("超出最大处理数字");
        }
        if (money.compareTo(BigDecimal.ZERO) < 0) {
            ChineseStr.append("负");
            money = money.abs();
        }
        String moneyStr = money.setScale(4, BigDecimal.ROUND_HALF_UP).toPlainString();
        String[] parts = moneyStr.split("\\.");
        //处理整数部分
        String IntegerNum = parts[0];
        int IntLen = IntegerNum.length();
        int zeroCount = 0;
        for (int i = 0; i < IntLen; i++) {
            int n = Integer.parseInt(String.valueOf(IntegerNum.charAt(i)));
            int p = IntLen - i - 1;
            int q = p / 4;
            int m = p % 4;
            if (n == 0) {
                zeroCount++;
            } else {
                if (zeroCount > 0) {
                    ChineseStr.append(CN_NUMS[0]);
                }
                zeroCount = 0;
                ChineseStr.append(CN_NUMS[n]).append(CN_INT_RADICE[m]);
            }
            if (m == 0 && zeroCount < 4) {
                ChineseStr.append(CN_INT_UNITS[q]);
            }
        }
        ChineseStr.append(CN_INT_LAST);
        //处理小数部分
        if (parts.length > 1) {
            String DecimalNum = parts[1];
            int decLen = DecimalNum.length();
            for (int i = 0; i < decLen; i++) {
                int n = Integer.parseInt(String.valueOf(DecimalNum.charAt(i)));
                if (n != 0) {
                    ChineseStr.append(CN_NUMS[n]).append(CN_DEC_UNITS[i]);
                }
            }
            if (ChineseStr.length() == 0) {
                ChineseStr.append(CN_NUMS[0]).append(CN_INT_LAST).append(CN_INTEGER);
            }
        } else {
            ChineseStr.append(CN_INTEGER);
        }
        return ChineseStr.toString();
    }

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

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值