You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中zh-CN Locale下数字转简体中文汉字格式的实现问题

问题分析

默认的NumberFormat.getInstance(Locale)在zh-CN下返回的是符合中文日常使用习惯的阿拉伯数字格式,这是JDK对该Locale的默认数值格式定义,所以会输出333而非汉字数字。要得到“三百三十三”的结果,需要自定义数字到中文汉字的转换逻辑,纯JDK环境下可以通过实现工具方法来完成。

解决方案

实现一个整数转中文汉字数字的工具方法,结合原有代码使用:

import java.text.NumberFormat;
import java.util.Locale;

public class NumberLocaleDemo {
    public static void main(String[] args) {
        // 阿拉伯语区域格式
        Locale loc = new Locale("ar", "SA");
        NumberFormat nfloc = NumberFormat.getInstance(loc);
        System.out.println("number (Arabic): " + nfloc.format(333));
        
        // 中文简体数字转换
        System.out.println("number (Chinese Simplified): " + numberToChinese(333));
    }

    /**
     * 将整数转换为中文汉字数字
     */
    public static String numberToChinese(int num) {
        if (num == 0) {
            return "零";
        }
        // 数字对应汉字
        char[] digits = {'零', '一', '二', '三', '四', '五', '六', '七', '八', '九'};
        // 单位数组,对应个位、十位、百位...亿位
        String[] units = {"", "十", "百", "千", "万", "十万", "百万", "千万", "亿"};
        StringBuilder result = new StringBuilder();
        String numStr = String.valueOf(num);
        int length = numStr.length();
        boolean hasLastZero = false;

        for (int i = 0; i < length; i++) {
            int digit = numStr.charAt(i) - '0';
            int unitIndex = length - 1 - i;

            if (digit == 0) {
                hasLastZero = true;
                // 最后一位零不输出
                if (unitIndex == 0) {
                    continue;
                }
            } else {
                // 补零:如果前一位是零且当前位非零,添加零字
                if (hasLastZero) {
                    result.append(digits[0]);
                    hasLastZero = false;
                }
                result.append(digits[digit]).append(units[unitIndex]);
            }
        }

        // 处理特殊情况:"一十"简化为"十"
        if (result.length() >= 2 && result.charAt(0) == '一' && result.charAt(1) == '十') {
            result.deleteCharAt(0);
        }

        return result.toString();
    }
}
输出结果
number (Arabic): ٣٣٣
number (Chinese Simplified): 三百三十三
说明
  • 该工具方法支持正整数转换,如需处理负数、小数或更大范围的数字,可以在此基础上扩展逻辑。
  • JDK原生的NumberFormat未提供中文汉字数字的默认格式,因为这不属于中文日常数值展示的标准格式,因此需要自定义转换逻辑实现需求。

内容的提问来源于stack exchange,提问作者vaughn222

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:40:15