2012-03-19 32 views
16

如何才能獲得對應於ISO 4217貨幣代碼(例如「EUR」或「USD」)的NumberFormat(或DecimalFormat)實例,以正確格式化價格?如何從貨幣代碼中獲取NumberFormat實例?

注1:我遇到的問題是,NumberFormat/DecimalFormat類有 getCurrencyInstance(Locale locale)方法,但我無法弄清楚如何 從ISO 4217貨幣代碼獲得一個Locale對象。

注2:還有具有getInstance(String currencyCode)方法(對於給定的ISO 4217幣種代碼返回Currency 實例)一類java.util.Currency但同樣我不 如何從一個Currency對象獲取到NumberFormat 實例...

回答

18

我不知道我理解正確的,但你可以嘗試這樣的:

public class CurrencyTest 
{ 
    @Test 
    public void testGetNumberFormatForCurrencyCode() 
    { 
     NumberFormat format = NumberFormat.getInstance(); 
     format.setMaximumFractionDigits(2); 
     Currency currency = Currency.getInstance("USD"); 
     format.setCurrency(currency); 

     System.out.println(format.format(1234.23434)); 
    } 
} 

輸出:

1,234.23 

注意,我單獨設置的小數位的最大數量,NumberFormat.setCurrency不接觸的小數位的最大數量:

設置此使用的貨幣格式化貨幣 值時的數字格式。這不會更新數字格式使用的最小或最大數字分數 。

+2

該解決方案是不理想的,因爲貨幣有時顯示格式爲「HK $ 0.69」,而不是由斯賓塞Kormos提到「$ 0.69」,卻發現這解決方案是最簡單和最乾淨的,並且需要按壓,所以就隨之而去。只是做了一個改變 - 而不是調用'format.setMaximumFractionDigits(2);',我正在調用'format.setMaximumFractionDigits(currency.getDefaultFractionDigits());'來代替。 – 2012-03-20 14:59:43

+1

我建議使用的'NumberFormat.getCurrencyInstance()',而不是僅僅'的getInstance()'。 – 2013-08-21 20:42:30

+0

我想這是用於'進口java.text.NumberFormat中;'和'沒有進口android.icu.text.NumberFormat;'。看起來android.icu.text.NumberFormat中的NumberFormat中的setMaximumFractionDigits和setCurrency只能在最低API級別24下工作。 – 2017-06-10 19:40:30

1

試試下面的方法:

private static NumberFormat getNumberFormat(String currencyCode) 
{ 
    Currency currency = Currency.getInstance(currencyCode); 

    Locale[] locales = NumberFormat.getAvailableLocales(); 

    for (Locale locale : locales) 
    { 
     NumberFormat numberFormat = NumberFormat.getCurrencyInstance(locale); 

     if (numberFormat.getCurrency() == currency) 
      return numberFormat; 
    } 

    return null; 
} 
+0

感謝Bernard響應。不幸的是,正如亞當指出的那樣,一個給定的貨幣代碼可以映射到多個區域設置是個問題... – 2012-03-20 14:55:07

+1

不客氣。我想有一個一對多的映射。 – Bernard 2012-03-20 14:59:00

6

映射有時是一對多...喜歡歐元在許多國家(語言環境)使用...

僅僅因爲貨幣代碼是相同的如本例所示的格式可能會有所不同:

private static Collection<Locale> getLocalesFromIso4217(String iso4217code) { 
    Collection<Locale> returnValue = new LinkedList<Locale>(); 
    for (Locale locale : NumberFormat.getAvailableLocales()) { 
     String code = NumberFormat.getCurrencyInstance(locale). 
     getCurrency().getCurrencyCode(); 
     if (iso4217code.equals(code)) { 
      returnValue.add(locale); 
     } 
    } 
    return returnValue; 
} 

public static void main(String[] args) { 
    System.out.println(getLocalesFromIso4217("USD")); 
    System.out.println(getLocalesFromIso4217("EUR")); 
    for (Locale locale : getLocalesFromIso4217("EUR")) { 
     System.out.println(locale + "=>" + NumberFormat.getCurrencyInstance(locale).format(1234)); 
    } 
} 

輸出

[en_US, es_US, es_EC, es_PR] 
[pt_PT, el_CY, fi_FI, en_MT, sl_SI, ga_IE, fr_BE, es_ES, de_AT, nl_NL, el_GR, it_IT, en_IE, fr_LU, nl_BE, ca_ES, sr_ME, mt_MT, fr_FR, de_DE, de_LU] 

pt_PT=>1.234,00 € 
el_CY=>€1.234,00 
fi_FI=>1 234,00 € 
en_MT=>€1,234.00 
sl_SI=>€ 1.234 
ga_IE=>€1,234.00 
fr_BE=>1.234,00 € 
es_ES=>1.234,00 € 
de_AT=>€ 1.234,00 
nl_NL=>€ 1.234,00 
el_GR=>1.234,00 € 
it_IT=>€ 1.234,00 
en_IE=>€1,234.00 
fr_LU=>1 234,00 € 
nl_BE=>1.234,00 € 
ca_ES=>€ 1.234,00 
sr_ME=>€ 1.234,00 
mt_MT=>€1,234.00 
fr_FR=>1 234,00 € 
de_DE=>1.234,00 € 
de_LU=>1.234,00 € 
5

區域設置既可以用於獲取區域設置的標準貨幣,也可以在您指定的區域設置中正確打印任意貨幣符號。這是兩個截然不同的操作,並沒有真正相關。

Java Internationalization tutorial開始,您首先使用區域設置或ISO代碼獲取貨幣實例。然後您可以使用另一個區域設置打印符號。因此,如果您從en_US區域設置獲取美國貨幣,並調用getSymbol(),它將打印「$」。但是,如果您使用英文區域設置調用getSymbol(Locale),它將打印「USD」。

所以,如果你不關心你的當前用戶的語言環境是什麼,你只關心貨幣,那麼您可以在所有情況下忽略區域設置。

如果您在意基於您當前的用戶正確表示貨幣符號,那麼您需要獲取特定於用戶位置的用戶的區域設置

+0

像esaj提到,貨幣而不是語言環境是什麼設置小數點格式。 Locale就是如何顯示貨幣符號和小數點分隔符。 – 2012-03-19 21:13:57

2

爲了完整起見,雖然我從來沒有使用過它,你可能想給Joda Money一試。如果它和Joda-Time一樣好,它可能比標準的JDK更容易,更強大。

0
public class PriceHelper { 
    public static String formatPrice(Context context, String currencyCode, 
             double price) { 
     if (price == 0) { 
      return context.getString(R.string.free); 
     } 
     Currency currency = Currency.getInstance(currencyCode); 
     NumberFormat format = NumberFormat.getCurrencyInstance(); 
     format.setCurrency(currency); 
     return format.format(price); 
    } 
} 
-1

這裏有一個方法:

String formatPrice(double amnt) { 
    NumberFormat formatter = NumberFormat.getCurrencyInstance(); 
    Currency currency = Currency.getInstance("USD"); 
    formatter.setCurrency(currency); 
    return formatter.format(amnt); 
} 
+0

這與5年前接受的答案是一樣的答案! – 2017-05-14 21:21:58

相關問題