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

时间:2009-05-21 17:55:28

标签: java internationalization currency turkish

我正在尝试用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格式化会产生类似的结果。

我真的不想写另一个Currency类,特别是当Java有一个内置的时候。

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

4 个答案:

答案 0 :(得分:5)

复活以供进一步参考:

您可以使用DecimalFormatSymbols更改用于格式化的货币

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

或者您可以诉诸SPI并插入您的货币符号(可能通过创建您自己的国家/地区变体,如new Locale("tr","TR","try"))。为此,您应该为java.util.spi.CurrencyNameProvider提供一个实现,并使用Java扩展机制注册它。查看http://java.sun.com/javase/6/docs/api/java/util/spi/LocaleServiceProvider.html

答案 1 :(得分: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

因此,或许可以自己编写一些内容,将现有代码映射到过时的代码,并根据需要进行调整和测试。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

等待Java时的平均时间:

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