如何在Java中覆盖货币符号?

11

我想使用Java打印土耳其里拉(ISO 4217货币代码为TRY)的价格。

当我执行以下操作时:

Currency curr = Currency.getInstance("TRY");
Locale trLocale = new Locale("tr", "TR");
System.out.println(curr.getSymbol(trLocale));

输出结果为:"YTL"。

然而,土耳其里拉货币符号最近已经从"YTL"更改为"TL"(在土耳其里拉的维基百科页面上可以看到)。使用NumberFormat进行格式化会得出类似的结果。

我真的不想再编写另一个货币类,特别是当Java已经内置了一个货币类时。

有没有办法覆盖Java默认的TRY货币符号为"TL"?


2
这并不能立即帮助解决问题,但是提交一个 bug 报告,它很可能会在下一个 Java 更新中得到修复。 - Michael Myers
1
除了为Currency创建自己的包装器之外,没有其他方法。Currency是一个final类,因此甚至无法扩展以覆盖getSymbol以适应你的特定情况。要么接受YTL并报告这个bug(并希望在下一个补丁中修复),要么实现你自己的解决方案。 - z -
4个回答

7

供参考:

您可以使用DecimalFormatSymbols来更改货币格式:

Locale trLocale = new Locale("tr", "TR");
DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getCurrencyInstance(trLocale);
DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(trLocale);
dfs.setCurrencySymbol("TL");
decimalFormat.setDecimalFormatSymbols(dfs);

或者你可以向SPI求助,插入你的货币符号(也许通过创建您自己的国家变体,如new Locale("tr","TR","tl"))。为了做到这一点,您应该提供一个实现java.util.spi.CurrencyNameProvider的实现,并向Java扩展机制注册它。请查看LocaleServiceProvider文档


3
有趣的是,根据维基百科,货币代码“TRL”已经过时(土耳其里拉的旧代码)。我还没有升级到最新的jdk(使用1.5.0_10版本),但是: Currency curr = Currency.getInstance("TRL"); Locale trLocale = new Locale("tr", "TR"); System.out.println(curr.getSymbol(trLocale)); 输出:
TL
因此,也许可以编写自己的代码将现有代码映射到过时的代码,并进行必要的调整和测试。

能够使用旧货币代码可能是一种好运吧。不错的技巧! - extraneon
他们从旧货币中去掉了六个零,所以实际上差异是一百万比一...小心你所期望的! - vikingsteve

2
在Java 7中,您可以在属性文件中覆盖货币。如果您依赖于ISO-4217符号,则可以在那里指定/覆盖。

1
但是那个属性文件只包含与ISO 4217相关的信息。而ISO 4217不包含货币符号。 - user110665

0

在你等待Java的同时:

System.out.println(curr.getSymbol(trLocale).substring(1));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接