2012-07-16 46 views
2

我試圖解析和存儲貨幣金額爲BigDecimal值。我給出了有問題的貨幣區域,在大多數情況下它運行良好,但當貨幣是哥斯達黎加科隆時,我得到了意想不到的結果。貨幣:小數位數意外爲零

我的哥斯達黎加客戶通知我,典型貨幣金額可能看起來像1.508.534,16,16是小數部分(小數點後兩位)。但是,當我撥打Currency.getDefaultFractionDigits()時,它將返回0而不是2作爲小數位數。因此,我正在計算的值被錯誤地截斷。

代碼如下所示:

// currencyLocale is "es_CR" 
Currency currency = Currency.getInstance(currencyLocale); 
int scale = currency.getDefaultFractionDigits(); 
// scale is 0 instead of 2 

BigDecimal v = new BigDecimal("12.34") 
          .setScale(scale, BigDecimal.ROUND_HALF_DOWN); 
// gives 12 instead of 12.34 

注意,雖然最終用戶可見的金額是否正確格式化的語言環境與,作爲小數點分隔符,數據源這裏提供的值作爲標準1234.56十進制數。

我在做什麼錯?


UPDATE

做一些更多的研究後,和reporting the issue to Google,我現在確信,這是一個Android的bug。谷歌的迴應是,這是按預期運作的,因爲受影響的貨幣只能用於整數倍數(最小的硬幣是5科隆)。

谷歌的迴應忽略了一個事實,你可以很合理地有分數金額在您的銀行帳戶,不過,電匯,利息計算的結果等

+0

你是否在實際設備和仿真器上得到了相同的結果?我遇到了與模擬器上的預期設置不同的Locale問題 – Kennet 2012-07-16 13:57:58

+0

是的,模擬器上的結果相同。 – 2012-07-16 23:02:46

回答

1

不是一個真正的答案,但其打印2( Java JDK,而不是Android):

public static void main(String[] args) { 
    Locale currencyLocale = new Locale("es","CR"); 
    Currency currency = Currency.getInstance(currencyLocale); 
    System.out.println(currency.getDefaultFractionDigits()); 
} 
+1

這也可以在Java JDK下爲我打印2,但是Android中的相同代碼返回0.我不知道這是否是Android錯誤,或者如果該特定貨幣不被歐洲設備完全支持,而是我向Google報告過該錯誤的任何事件:http://code.google.com/p/android/issues/detail?id=35057&thanks=35057&ts=1342478572 – 2012-07-16 22:51:25

+1

谷歌已經承認他們的行爲與JDK不同,但是,似乎並不想對此做任何事情。好吧。 – 2012-07-18 12:31:48