0

最近、Sun /Oracleはウクライナグリブナの通貨コードを誤ったものに変更しました。これをコードで修正する必要があります。

Java 6では、CurrencyNameProvider(も参照)を介してJavaレベル(詳細はこちら)でそれを実行できるはずです。

残念ながら、どのロケールがメソッドを返す必要があるのか​​わかりません

public Locale[] getAvailableLocales() {}

実例は大歓迎です!

4

2 に答える 2

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;
        }
    }
}
于 2011-04-30T16:35:03.467 に答える
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_UA u​​ngarn$$$に新しいシンボルを提供しようとする例:

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を返します。

于 2011-05-01T18:54:59.690 に答える