如何在Java中重写货币符号?

如何在Java中重写货币符号?,java,internationalization,currency,turkish,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”(如维基百科上土耳其里拉的页面所示)。使用NumberForm

我正在尝试用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有一个内置类的时候


有没有一种方法可以覆盖Java的默认货币符号来尝试“TL”?

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

在等待Java的同时:

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

有趣的是,根据维基百科,货币代码“TRL”已经过时(土耳其里拉的旧代码)。我还没有升级到最新的jdk(1.5.0_10),但是


Currency curr=Currency.getInstance(“TRL”)
语言环境trLocale=新语言环境(“tr”、“tr”)
System.out.println(curr.getSymbol(trLocale));

印刷品:

热释光


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

复活供进一步参考:

您可以使用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并插入您的货币符号(可能通过创建您自己的国家变体,如
新语言环境(“tr”、“tr”、“try”)
)。为了做到这一点,您应该为
java.util.spi.CurrencyNameProvider
提供一个实现,并用java扩展机制注册它。检查一下

这不会立即有帮助,但如果您提交了一个bug,它可能会在下一次Java更新中得到修复。除了为货币创建自己的包装器之外,没有其他方法。Currency是最后一个类,因此它甚至不能扩展为覆盖特定情况下的getSymbol。要么使用YTL并报告错误(希望在下一个补丁中修复),要么实现您自己的解决方案。但该属性文件仅包含ISO 4217相关信息。ISO 4217不包含货币符号。我想能够使用旧的货币代码是一种幸运。干得好!他们在旧货币上减去了六个零,所以差额实际上是一百万比一。。。小心你的愿望!