3

春の通貨フォーマッターを使用して、通貨コードに基づいて値をフォーマットします

public String format(Number number, String currencyCode)
{
    CurrencyFormatter formatter = new CurrencyFormatter();
    formatter.setCurrency(Currency.getInstance(currencyCode));
    return formatter.print(number, Locale.getDefault());        
}

したがって、format(10、 "GBP")と呼ぶと、ロケールに関係なく、値を£10.00に戻す必要があります。

これは可能ですか?

4

2 に答える 2

5

通貨を表示するときは常に、通貨コードと結果を表示するロケールの 2 つの情報が必要です。たとえば、en_US ロケールで USD を表示する場合は $ を表示したいが、en_AU ロケールでは US$ として表示したい (オーストラリアの通貨は「ドル」とも呼ばれ、$ 記号を使用するため)豪ドル)。

あなたが遭遇した問題は、「非主要」ロケールで通貨を表示しているときに、ストック Java 通貨フォーマッターが悪臭を放つことです。つまり、米国のほとんどの人は、ポンドとユーロを表示するときはむしろ £ と € を表示しますが、ストック Java ライブラリは、これらの通貨を en_US ロケールで表示するときに "GBP" と "EUR" を表示します。

次のコードでこれを回避しました。基本的に、国際通貨を表示するときに使用する独自の記号を指定します。

public static NumberFormat newCurrencyFormat(Currency currency, Locale displayLocale) {
    NumberFormat retVal = NumberFormat.getCurrencyInstance(displayLocale);
    retVal.setCurrency(currency);

    //The default JDK handles situations well when the currency is the default currency for the locale
    if (currency.equals(Currency.getInstance(displayLocale))) {
        return retVal;
    }

    //otherwise we need to "fix things up" when displaying a non-native currency
    if (retVal instanceof DecimalFormat) {
        DecimalFormat decimalFormat = (DecimalFormat) retVal;
        String correctedI18NSymbol = getCorrectedInternationalCurrencySymbol(currency, displayLocale);
        if (correctedI18NSymbol != null) {
            DecimalFormatSymbols dfs = decimalFormat.getDecimalFormatSymbols(); //this returns a clone of DFS
            dfs.setInternationalCurrencySymbol(correctedI18NSymbol);
            dfs.setCurrencySymbol(correctedI18NSymbol);
            decimalFormat.setDecimalFormatSymbols(dfs);
        }
    }

    return retVal;
}

private static String getCorrectedInternationalCurrencySymbol(Currency currency, Locale displayLocale) {
    ResourceBundle i18nSymbolsResourceBundle =
            ResourceBundle.getBundle("correctedI18nCurrencySymbols", displayLocale);
    if (i18nSymbolsResourceBundle.containsKey(currency.getCurrencyCode())) {
        return i18nSymbolsResourceBundle.getString(currency.getCurrencyCode());
    } else {
        return currency.getCurrencyCode();
    }
}

次に、使用する通貨記号を指定するプロパティ ファイル (correctedI18nCurrencySymbols.properties) を作成します。

# Note that these are the currency symbols to use for the specified code when displaying in a DIFFERENT locale than
# the home locale of the currency. This file can be edited as needed. In addition, if in some case one specific locale
# would use a symbol DIFFERENT than the standard international one listed here, then an additional properties file
# can be added making use of the standard ResourceBundle loading algorithm. For example, if we decided we wanted to
# show US dollars as just $ instead of US$ when in the UK, we could create a file i18nCurrencySymbols_en_GB.properties
# with the entry USD=$
ARS=$AR
AUD=AU$
BOB=$b
BRL=R$
CAD=CAN$
CLP=Ch$
COP=COL$
CRC=\u20A1
HRK=kn
CZK=K\u010D
DOP=RD$
XCD=EC$
EUR=\u20AC
GTQ=Q
GYD=G$
HNL=L
HKD=HK$
HUF=Ft
INR=\u20B9
IDR=Rp
ILS=\u20AA
JMD=J$
JPY=JP\u00A5
KRW=\u20A9
NZD=NZ$
NIO=C$
PAB=B/.
PYG=Gs
PEN=S/.
PHP=\u20B1
PLN=\u007A\u0142
RON=lei
SGD=S$
ZAR=R
TWD=NT$
THB=\u0E3F
TTD=TT$
GBP=\u00A3
USD=US$
UYU=$U
VEF=Bs
VND=\u20AB
于 2013-07-31T16:43:59.720 に答える
0

私は Spring に詳しくありませんが、次のような問題があるようです: Locale.getDefault(). Locale代わりに、クラスで定義された静的インスタンスの 1 つを使用してみてください。

于 2011-03-28T23:47:31.410 に答える