2011-04-30 67 views
0

最近Sun/Oracle将乌克兰hrivna的货币代码更改为不正确的货币代码,我必须在我的代码中修复此问题。Java 6重新定义货币符号(通过CurrencyNameProvider?)

我发现Java 6应该允许我通过CurrencyNameProvider(see also)在Java级别(详情为here)执行此操作。

不幸的是我不明白哪些语言环境应该返回方法

public Locale[] getAvailableLocales() {} 

任何工作的例子是欢迎!

+0

为了以防万一,我打算解决的错误在Java 6更新25中得到了纠正。详细信息在这里(俄文版)http://foxyboa.blogspot.com/2011/05/java-oracle.html – FoxyBOA 2011-05-05 13:09:49

回答

1

LocaleServiceProvider:Locale sensitive factory methods and methods for name retrieval in the java.text and java.util packages invoke service provider methods when needed to support the requested locale. The methods first check whether the Java runtime environment itself supports the requested locale, and use its support if available. Otherwise, they call the getAvailableLocales() methods of installed providers for the appropriate interface to find one that supports the requested locale.

因此,如果JRE有请求的区域设置的支持,你不能在你的扩展自定义提供覆盖它,因为默认的供应商将首先问。

实施例,它试图对UAH为区域设置xx_YY提供一个新的符号BungaBungauk_UAungarn $$$

public class UkCurrencyNameProvider extends CurrencyNameProvider { 
private static final Locale XX_YY = new Locale("xx", "YY"); 
private static final Locale UK_UA = new Locale("uk", "UA"); 
private static final Map<Locale, String> SYMBOL_MAP; 
static { 
SYMBOL_MAP = new HashMap<Locale, String>(); 
UkCurrencyNameProvider.SYMBOL_MAP.put(UkCurrencyNameProvider.XX_YY, 
     "BungaBunga"); 
UkCurrencyNameProvider.SYMBOL_MAP.put(UK_UA, "ungarn$$$"); 
} 
private static final Locale[] AVAILABLE_LOCALES = UkCurrencyNameProvider.SYMBOL_MAP 
     .keySet().toArray(
       new Locale[UkCurrencyNameProvider.SYMBOL_MAP.size()]); 

/* 
* (non-Javadoc) 
* @see java.util.spi.CurrencyNameProvider#getSymbol(java.lang.String, 
* java.util.Locale) 
*/ 
@Override 
public String getSymbol(final String currencyCode, final Locale locale) { 
    final String result; 
    if ("UAH".equals(currencyCode)) { 
    result = UkCurrencyNameProvider.SYMBOL_MAP.get(locale); 
    } else { 
    result = null; 
    } 
    return result; 
} 

/* 
* (non-Javadoc) 
* @see java.util.spi.LocaleServiceProvider#getAvailableLocales() 
*/ 
@Override 
public Locale[] getAvailableLocales() { 
    return UkCurrencyNameProvider.AVAILABLE_LOCALES.clone(); 

} 

}

代码

Locale[] test=new Locale[] {new Locale("xx","YY"),new Locale("uk","UA")}; 
for (Locale loc:test) 
{System.out.println(loc+": "+Currency.getInstance("UAH").getSymbol(loc));} 

将输出

xx_YY:BungaBunga

uk_UA:грл。

因为标准JRE知道uk_UA并将提供其已知的货币符号грл。。对于xx_YY,JRE没有任何信息,并会询问扩展中的提供者。定制提供商将返回BungaBunga

+0

+1 – 2011-05-01 19:04:53

2
// Be aware that you need to provide ukrainian names to ALL currency symbols which 
// your program uses. 

import java.util.Locale; 
import java.util.spi.CurrencyNameProvider; 

public class UaCurrencyNameProvider extends CurrencyNameProvider { 

    private static final Locale UKRAINE = new Locale("uk", "UA"); 
    private static final String UAH_SYMB = "грн."; 
    private Locale[] availableLocales = new Locale[] {UKRAINE}; 

    @Override 
    public Locale[] getAvailableLocales() { 
     return availableLocales; 
    } 

    @Override 
    public String getSymbol(String currencyCode, Locale locale) { 
     if(currencyCode == null) { 
      throw new NullPointerException(); 
     } 
     else if(!UKRAINE.equals(locale)) { 
      throw new IllegalArgumentException("Locale not supported"); 
     } 
     else if("UAH".equals(currencyCode)) { 
      return UAH_SYMB; 
     } else { 
      return null; 
     } 
    } 
} 
+0

可能的,我失去了一些东西,但货币uah = Currency.getInstance(“UAH”); System.out.println(uah.getSymbol()); 仍然返回“грл”。 – FoxyBOA 2011-04-30 16:44:01

+0

你应该使用'UAH'作为'UAH_SYMB',参见http://en.wikipedia.org/wiki/Hryvnia_sign – 2011-04-30 16:50:24

+0

从ApiDoc; '如果没有符号可以确定,则返回null',所以'getSymbol(String currencyCode,Locale locale)'的实现必须返回'null'而不是抛出IllegalArgumentException。 – 2011-04-30 16:52:35