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

使用ICU4J进行数字本地化转换时,日/泰区域转换失效

解决ICU4J转换泰语/日语本地化数字失效问题

问题原因

ICU4J 默认的 NumberFormat.getInstance(locale) 不会自动启用目标语言的本地化数字系统转换,尤其是使用 Java 原生 Locale 时,可能无法加载完整的 ICU 本地化配置,导致输出仍为阿拉伯数字。

解决方案

1. 使用 ICU 专属 ULocale 并指定数字系统

ICU 推荐使用 ULocale 替代 Java 原生 Locale,配合 setNumberingSystem 方法显式指定目标数字系统,这是最可靠的方式:

泰语数字转换示例

import com.ibm.icu.math.BigDecimal;
import com.ibm.icu.text.NumberFormat;
import com.ibm.icu.util.ULocale;

public class LocalNumberTest {
    public static void main(String[] args) {
        BigDecimal number = new BigDecimal("123.22");
        ULocale thaiLocale = new ULocale("th");
        NumberFormat format = NumberFormat.getInstance(thaiLocale);
        // 指定泰语数字系统
        format.setNumberingSystem("thai");
        String result = format.format(number);
        System.out.println(result); // 输出:๑๒๓.๒๒
    }
}

日语数字转换示例

  • 若需全角阿拉伯数字(123.22),指定数字系统为 fullwide:
ULocale jpLocale = new ULocale("ja");
NumberFormat format = NumberFormat.getInstance(jpLocale);
format.setNumberingSystem("fullwide");
String result = format.format(new BigDecimal("123.22"));
System.out.println(result); // 输出:123.22
  • 若需汉字数字(百二十三・二二),指定数字系统为 jpan:
format.setNumberingSystem("jpan");
String result = format.format(new BigDecimal("123.22"));
System.out.println(result); // 输出:百二十三・二二

2. 手动配置 DecimalFormatSymbols

如果需要更精细控制数字符号,可以直接修改 DecimalFormatSymbols:

import com.ibm.icu.text.DecimalFormat;
import com.ibm.icu.text.DecimalFormatSymbols;
import com.ibm.icu.math.BigDecimal;
import com.ibm.icu.util.ULocale;

public class LocalNumberTest {
    public static void main(String[] args) {
        BigDecimal number = new BigDecimal("123.22");
        ULocale thaiLocale = new ULocale("th");
        DecimalFormat format = (DecimalFormat) NumberFormat.getInstance(thaiLocale);
        DecimalFormatSymbols symbols = format.getDecimalFormatSymbols();
        // 手动设置泰语数字符号
        symbols.setDigitSymbols(new char[]{'๑', '๒', '๓', '๔', '๕', '๖', '๗', '๘', '๙', '๐'});
        format.setDecimalFormatSymbols(symbols);
        String result = format.format(number);
        System.out.println(result); // 输出:๑๒๓.๒๒
    }
}

关键注意点

  • 必须使用 ICU 提供的类(如 com.ibm.icu.util.ULocale、com.ibm.icu.text.NumberFormat),而非 Java 原生类,否则无法触发 ICU 的本地化逻辑。
  • 不同语言的数字系统标识符可通过 ICU 的 NumberingSystem.getAvailableNames() 方法查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:06:08