数字金额转换大写工具

金额转换Java工具类

好久没时间更新了,在实习,实在有些忙。在实习中遇到个需求,在处理合同数据中,需要将数字金额进行转换成大写的形式。当时也找了不少资料。实现到了最大单位京的转换,我觉得这个很有意义,说不定下次用上记录下。

package com.panda.apps.beitou.utils;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;

@Component
public class ChineseCurrencyFormatter {
    private static final char[] CHINESE_NUM = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
    private static final String[] CHINESE_UNIT = {"", "拾", "佰", "仟"};
    private static final String[] BIG_UNIT = {"", "万", "亿", "兆", "京"};

    public static String convertToChineseCurrency(BigDecimal amount) {
        if (amount.compareTo(BigDecimal.ZERO) == 0) {
            return "零元整";
        }

        StringBuilder sb = new StringBuilder();
        long yuan = amount.longValue(); // 整数部分
        int decimal = amount.subtract(new BigDecimal(yuan)).multiply(new BigDecimal(100)).intValue(); // 小数部分

        // 处理整数部分
        if (yuan > 0) {
            String yuanStr = Long.toString(yuan);
            int length = yuanStr.length();
            int groupCount = (length + 3) / 4; // 大单位组的数量
            boolean zeroFlag = false; // 标记是否需要插入零

            for (int i = 0; i < groupCount; i++) {
                int start = length - (i + 1) * 4;
                int end = length - i * 4;
                String group = yuanStr.substring(Math.max(start, 0), end);
                String chineseGroup = convertGroupToChinese(group);

                if (!"零".equals(chineseGroup)) {
                    if (zeroFlag) {
                        sb.insert(0, "零");
                        zeroFlag = false;
                    }
                    sb.insert(0, chineseGroup + BIG_UNIT[i]);
                } else {
                    zeroFlag = true;
                }
            }
            sb.append("元");
        }

        // 处理小数部分
        if (decimal == 0) {
            if (yuan == 0) {
                sb.append("零元整");
            } else {
                sb.append("整");
            }
        } else {
            int jiao = decimal / 10; // 角
            int fen = decimal % 10; // 分
            if (jiao != 0) {
                sb.append(CHINESE_NUM[jiao]).append("角");
            }
            if (fen != 0) {
                sb.append(CHINESE_NUM[fen]).append("分");
            }
        }

        return sb.toString();
    }

    private static String convertGroupToChinese(String group) {
        StringBuilder sb = new StringBuilder();
        int len = group.length();
        for (int i = 0; i < len; i++) {
            int num = group.charAt(i) - '0';
            if (num > 0) {
                sb.append(CHINESE_NUM[num]).append(CHINESE_UNIT[len - 1 - i]);
            } else {
                if (sb.length() > 0 && sb.charAt(sb.length() - 1) != '零') {
                    sb.append("零");
                }
            }
        }
        if (sb.length() > 0 && sb.charAt(sb.length() - 1) == '零') {
            sb.deleteCharAt(sb.length() - 1);
        }
        return sb.toString();
    }
//
    public static void main(String[] args) {
        //伍角陆分
        System.out.println(convertToChineseCurrency(new BigDecimal("0.56")));
//        壹元伍角陆分
        System.out.println(convertToChineseCurrency(new BigDecimal("1.56")));
        //零元整
        System.out.println(convertToChineseCurrency(new BigDecimal("0")));
        //玖仟玖佰玖拾玖兆玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖元柒角捌分
        System.out.println(convertToChineseCurrency(new BigDecimal("9999999999999999.78")));
    }
}






千京以上数据可能会出问题,也没时间调了,希望各位大佬可以修改,指点哈哈哈。又要加班了,不想上班了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明天码上有钱啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值