Java8与Java11货币格式化结果不一致 如何固定前缀为CAD
问题原因
跨Java版本货币格式化结果不一致,源于JDK内置本地化数据源的版本差异:Java 8默认使用JRE自带的历史兼容区域数据,Java 9及之后版本默认优先采用Unicode CLDR(通用区域数据仓库)的本地化规则,加元的默认显示符号从三位货币代码CAD更新为CA$,最终导致相同代码输出不同。
兼容方案
要跨所有Java版本固定输出CAD作为货币前缀,最稳定的实现方式是主动覆写格式化器的货币符号配置,完全不依赖JDK内置的默认区域数据,代码如下:
import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.NumberFormat; import java.util.Currency; public class CurrencyFormatTest { public static void main(String[] args) { Currency currency = Currency.getInstance("CAD"); NumberFormat formatter = NumberFormat.getCurrencyInstance(); formatter.setCurrency(currency); formatter.setMaximumFractionDigits(2); formatter.setMinimumFractionDigits(2); // 手动指定货币符号为ISO 4217标准货币代码,跨版本生效 DecimalFormatSymbols formatSymbols = ((DecimalFormat) formatter).getDecimalFormatSymbols(); formatSymbols.setCurrencySymbol(currency.getCurrencyCode()); ((DecimalFormat) formatter).setDecimalFormatSymbols(formatSymbols); System.out.println(formatter.format(10.00)); // 全版本统一输出:CAD10.00 } }
注意事项
- 上述实现无额外第三方依赖,在Java 8、Java 11、Java 17、Java 21等所有主流LTS版本均可稳定运行
- 不推荐通过修改JVM启动参数、切换区域数据源加载优先级的方式做兼容,这类方案强依赖部署环境配置,容易因环境差异再次出现格式不一致问题
- 该逻辑可通用到所有币种场景,替换
Currency.getInstance()的入参为目标币种代码,即可让所有货币格式化结果固定使用三位标准货币代码作为前缀,不会受JDK版本升级影响
内容的提问来源于stack exchange,提问作者Hades
相关产品推荐
相关产品推荐

