【java工具类】小数、整数转中文大写

小数、整数转中文大写

1、可转化小数的数字成为大写中文数字

2、代码如下

java 复制代码
public class NumberToChineseUtils {

        private static final String[] CAPITAL_NUMS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    private static final String[] UNITS = {"", "拾", "佰", "仟"};
    private static final String[] BIG_UNITS = {"", "万", "亿", "万亿"};
    private static final String[] DECIMAL_UNITS = {"角", "分", "厘"};

    public static String toChineseUpperCase(double amount) {
        if (Math.abs(amount) < 0.0005) return "零元整";

        String prefix = amount < 0 ? "负" : "";
        String strAmount = String.format("%.3f", Math.abs(amount));
        String[] parts = strAmount.split("\\.");
        long integerPart = Long.parseLong(parts[0]);
        String decimalPart = parts[1];

        StringBuilder result = new StringBuilder();

        // 1. 处理整数部分
        if (integerPart > 0) {
            result.append(integerToChinese(integerPart)).append("元");
        }

        // 2. 处理小数部分
        boolean hasDecimal = false;
        for (int i = 0; i < decimalPart.length(); i++) {
            int digit = decimalPart.charAt(i) - '0';
            if (digit > 0) {
                // 如果整数部分有值,且当前位(如分)前有0(如角为0),补一个"零"
                if (integerPart > 0 && !hasDecimal && i > 0 && (result.length() > 0 && !result.toString().endsWith("零"))) {
                    // 仅在"元"之后补零,例如:壹元零贰分
                    result.append("零");
                }
                result.append(CAPITAL_NUMS[digit]).append(DECIMAL_UNITS[i]);
                hasDecimal = true;
            }
        }

        // 3. 最终修整
        String finalResult = result.toString()
                .replaceAll("零+", "零")
                .replaceAll("零$", "");

        // 处理结尾:如果没有小数,加"整";如果没有内容,说明是0
        if (!hasDecimal) {
            finalResult += "整";
        }

        // 核心修复:确保开头不会出现"零"字,除非金额本身就是0
        finalResult = prefix + finalResult;
        if (finalResult.startsWith("零") && finalResult.length() > 1) {
            finalResult = finalResult.substring(1);
        }

        return finalResult.isEmpty() ? "零元整" : finalResult;
    }

    private static String integerToChinese(long num) {
        StringBuilder sb = new StringBuilder();
        int unitIndex = 0;
        while (num > 0) {
            int section = (int) (num % 10000);
            if (section != 0) {
                sb.insert(0, sectionToChinese(section) + BIG_UNITS[unitIndex]);
            } else if (sb.length() > 0 && !sb.toString().startsWith("零")) {
                sb.insert(0, "零");
            }
            num /= 10000;
            unitIndex++;
        }
        return sb.toString().replaceAll("零+", "零").replaceAll("零$", "");
    }

    private static String sectionToChinese(int section) {
        StringBuilder sb = new StringBuilder();
        boolean zeroFlag = true;
        for (int i = 0; i < 4; i++) {
            int digit = section % 10;
            if (digit == 0) {
                if (!zeroFlag) {
                    zeroFlag = true;
                    sb.insert(0, CAPITAL_NUMS[0]);
                }
            } else {
                zeroFlag = false;
                sb.insert(0, CAPITAL_NUMS[digit] + UNITS[i]);
            }
            section /= 10;
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println("12.56 -> " + toChineseUpperCase(12.56));      // 壹拾贰元伍角陆分
        System.out.println("0.56  -> " + toChineseUpperCase(0.56));       // 伍角陆分
        System.out.println("1005.02 -> " + toChineseUpperCase(1005.02));  // 壹仟零伍元零贰分
        System.out.println("0.003 -> " + toChineseUpperCase(0.003));      // 叁厘
        System.out.println("10.00 -> " + toChineseUpperCase(10.00));      // 壹拾元整



    }
相关推荐
geovindu4 分钟前
rust: Chain of Responsibility Pattern
开发语言·后端·设计模式·rust·责任链模式·行为模式
m0_587383004 分钟前
碰碰好评卡功能落地全流程实战指南 附核心逻辑与常见问题解决方案
java·前端·数据库·后端·struts·需求分析
cheems95274 分钟前
从统一响应到 Swagger:一篇讲清微服务接口文档设计未命名
java·微服务·架构·状态模式
阿里嘎多学长7 分钟前
2026-10-14 GitHub 热点项目精选
开发语言·程序员·github·代码托管
迪康coolmu7 分钟前
迪康Defender网络准入控制系统落地实战:部署、配置与问题排查记录
运维·开发语言·网络·经验分享·php
兰亭妙微UI设计公司8 分钟前
兰亭妙微分享:高手设计登录页的12种切入点
开发语言·前端·javascript
Y3815326628 分钟前
SerpBase + RAG 实战:用搜索 API 给知识库接上实时数据,回答不再过期
java·服务器·数据库
木由里予9 分钟前
3D NAND 闪存的可靠性
开发语言·嵌入式硬件
acd1200911 分钟前
Go 里 err 被不经意覆盖的几个现场
开发语言·后端·golang
前端Baymax11 分钟前
静默的 86 小时:全链 402 停摆与零告警的故障复盘
开发语言·前端·javascript