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
相关产品推荐
相关产品推荐

