阿拉伯数字转成中文钱的方法

final static private String[] CHINESE_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
    final static private String[] CHINESE_MONEY_UNIT = { "圆", "角", "分" };
    /**
     * @param sourceMoney 要转换的数值,最多支持到亿
     * @return 结果
     */
    public static String toChineseMoney(BigDecimal sourceMoney) {
        StringBuilder sb = new StringBuilder();
        // 整数部分
        BigDecimal intPart = sourceMoney.setScale(0, RoundingMode.DOWN);
        // 小数部分
        BigDecimal decimalPart = sourceMoney.subtract(intPart).multiply(new BigDecimal(100)).setScale(0,
                RoundingMode.DOWN);

        // 处理整数部分圆
        if (intPart.compareTo(BigDecimal.ZERO) > 0) {
            // 统计完后加上金额单位
            String strIntPart = intPart.toPlainString();
            sb = convertToChineseFormat(strIntPart);
            sb.append(CHINESE_MONEY_UNIT[0]);
        } else {
            sb.append(CHINESE_NUMBER[0]).append(CHINESE_MONEY_UNIT[0]);
        }

        // 处理小数部分
        if (decimalPart.compareTo(new BigDecimal(10)) >= 0) {
            // 角
            String jiao = decimalPart.toPlainString();
            int number = Integer.parseInt(String.valueOf(jiao.charAt(0)));
            if (number != 0) {
                String chineseNumber = CHINESE_NUMBER[number];
                sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[1]);
            }

            // 分
            String fen = decimalPart.toPlainString();
            number = Integer.parseInt(String.valueOf(fen.charAt(1)));
            if (number != 0) {
                String chineseNumber = CHINESE_NUMBER[number];
                sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[2]);
            }
        } else if (decimalPart.compareTo(BigDecimal.ZERO) > 0) {
            // 分
            String fen = decimalPart.toPlainString();
            int number = Integer.parseInt(String.valueOf(fen.charAt(0)));
            if (number != 0) {
                String chineseNumber = CHINESE_NUMBER[number];
                sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[2]);
            }
        } else {
            sb.append("整");
        }
        return sb.toString();
    }

    /**
     * 将字符串转换为中文格式
     *
     * @param str
     */
    public static StringBuilder convertToChineseFormat(String str) {
        while (str.startsWith("0")) { //将字符串最前面的0去掉
            str = str.substring(1, str.length());
        }
        char[] num = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        char[] cnNum = new char[]{'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
        for (int i = 0; i < 10; i++) {//将字符串数字替换成中文数字,循环对应替换
            str = str.replace(num[i], cnNum[i]);
        }

        StringBuilder sb = new StringBuilder(str);//StringBuilder存放字符串,用于插入删除操作
        int index = str.length() - 1;   //从第index个字符从后往前开始操作,操作一次,index--
        //存放金额单位
        String[] unit = {"", "拾", "佰", "仟"};
        String[] unit4 = {"万", "亿"};

        boolean flag = false;//判断前一个数是否为零的标记

        for (int i = 0; i < str.length(); i++) {//循环体内对sb进行操作

            //每4位插入万每8位插入亿,最低位先不设置单位
            if (i % 4 == 0 && i != 0) {
                //根据金额规则,单位万前面为4个零时,不插入万,并将index位置(最低位)的零删除
                if ((i / 4 - 1) % 2 == 0 && index >= 3 && str.substring(index - 3, index + 1).equals("零零零零")) {
                    sb.deleteCharAt(index);
                    index--;
                    continue;
                }
                //否则在index+1位置插入相应的单位:万、亿
                sb.insert(index + 1, unit4[(i / 4 - 1) % 2]);
            }
            //如果4位的最低位为零,删除最低位的零,将零标志置为true
            if (i % 4 == 0 && str.charAt(index) == '零') {
                sb.deleteCharAt(index);
                flag = true;
                index--;
                continue;
            }
            //如果前一位为零并且这一位也为零,删除这一位的零
            if (flag && str.charAt(index) == '零') {
                sb.deleteCharAt(index);
                index--;
                continue;
            }
            //如果当前位为零,将零标志置为true
            if (str.charAt(index) == '零') {
                flag = true;
                index--;
                continue;
            }
            //当前位不为零,将零标志位置为false,插入金额单位
            flag = false;
            sb.insert(index + 1, unit[i % 4]);
            index--;
        }
        return sb;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值