2009-05-21 32 views
9

我在用Java打印土耳其里拉(ISO 4217貨幣代碼TRY)的價格。如何覆蓋Java中的貨幣符號?

當我做

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」?

+2

這並不能立即提供幫助,但提交了一個錯誤,它可能會在下一次Java更新中修復。 – 2009-05-21 18:00:04

+1

除了爲貨幣創建自己的包裝外沒有其他辦法。貨幣是一個最終的類,所以它甚至不能擴展爲覆蓋您的特定情況下的getSymbol。或者與YTL同住並報告錯誤(並希望在下一個補丁中修復)或實施您自己的解決方案。 – 2009-05-21 18:28:03

回答

2

在Java 7中,您可以在屬性文件中使用override currencies。如果您依賴ISO-4217符號,則可以在此處指定/覆蓋該符號。

+1

但該屬性文件只包含ISO 4217相關信息。 ISO 4217不包含貨幣符號。 – user110665 2009-05-21 20:35:36

0

對於平均時間,當你等待的Java:

System.out.println(curr.getSymbol(trLocale).substring(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

因此,也許寫自己的東西映射現有的代碼已經過時編碼並根據需要進行調整和測試。

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