Java列支敦士登DecimalFormatSymbols分组分隔符错误的全局修复问询
全局修正Java 8中列支敦士登本地化分组分隔符错误的方案
你遇到的这个问题确实是Java 8里的一个本地化配置错误——列支敦士登(de_LI)的DecimalFormatSymbols分组分隔符被错误设置为.,而按照规范它应该和瑞士德语区(de_CH)保持一致,使用单引号'。要在整个Java安装环境全局修正这个问题,不用逐一修改业务代码,这里有几个可行的方案:
1. 自定义LocaleServiceProvider扩展(推荐)
Java提供了本地化服务提供者接口(SPI),允许我们覆盖默认的本地化数据实现。你可以创建一个自定义的DecimalFormatSymbolsProvider,专门为de_LI返回正确的符号配置:
步骤:
- 编写自定义Provider类:
import java.text.DecimalFormatSymbols; import java.text.spi.DecimalFormatSymbolsProvider; import java.util.Locale; public class LiechtensteinDecimalFormatProvider extends DecimalFormatSymbolsProvider { @Override public DecimalFormatSymbols getInstance(Locale locale) { // 匹配列支敦士登的Locale if ("de".equals(locale.getLanguage()) && "LI".equals(locale.getCountry())) { // 直接复用瑞士的正确配置 return DecimalFormatSymbols.getInstance(new Locale("de", "CH")); } // 其他Locale返回null,让默认Provider处理 return null; } @Override public Locale[] getAvailableLocales() { // 只声明我们处理的Locale return new Locale[]{new Locale("de", "LI")}; } }
- 打包这个类到JAR文件,然后在JAR的
META-INF/services目录下创建一个名为java.text.spi.DecimalFormatSymbolsProvider的文件,文件内容是你的自定义类的全限定名(比如com.yourcompany.LiechtensteinDecimalFormatProvider)。 - 将这个JAR放到Java安装目录的
jre/lib/ext文件夹下,或者在启动Java应用时通过-Xbootclasspath/a:your-provider.jar参数指定加载路径。Java启动时会优先使用你的自定义Provider来处理de_LI的本地化符号。
2. 修改Java核心本地化资源文件
如果需要彻底修改全局Java环境的配置,可以直接修改Java自带的本地化数据:
步骤:
- 找到Java安装目录下的
jre/lib/ext/localedata.jar,将其解压到临时目录。 - 在解压后的文件中找到
sun/text/resources/de_LI/FormatData_de_LI.properties文件。 - 打开该文件,找到
decimalFormatSymbols.groupingSeparator属性,将其值修改为\'(properties文件中需要转义单引号),也就是:decimalFormatSymbols.groupingSeparator=\' - 重新打包localedata.jar,替换原来的文件(操作前请务必备份原文件)。
注意:这种方式会修改Java核心库,后续升级Java版本时需要重新执行该操作,且会影响所有使用该Java环境的应用。
3. 升级Java版本(如果可行)
你可以测试一下Java 11及以后的版本是否已经修复了这个问题——很多本地化配置错误在后续Java版本中都得到了修正。如果你的应用可以升级Java版本,这会是最省心的解决方案。
内容的提问来源于stack exchange,提问作者Udo Klimaschewski
相关产品推荐
相关产品推荐

