4

通貨の金額を値として解析して保存しようとしていBigDecimalます。問題の通貨のロケールが指定されており、ほとんどの場合は正常に機能しますが、通貨がコスタリカコロンの場合、予期しない結果が得られます。

コスタリカの顧客から、一般的な通貨の金額は小数部(小数点以下第2位)であるよう1.508.534,16に見える可能性があると通知されました。,16ただし、呼び出すと、小数桁数ではなくCurrency.getDefaultFractionDigits()返されます。その結果、私が計算している値が誤って切り捨てられています。02

コードは次のようになります。

// 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小数点以下の金額として提供していることに注意してください。

私は何が間違っているのですか?


アップデート

さらに調査を行い、問題をGoogleに報告した結果、これはAndroidのバグであると確信しました。影響を受ける通貨は整数の倍数でしか使用できないため、これは意図したとおりに機能するというGoogleの回答です(最小のコインは5コロンです)。

Googleの回答では、電信送金や利息の計算などの結果として、銀行口座にかなり合法的に小額を入れることができるという事実を無視しています。

4

1 に答える 1

2

実際には答えではありませんが、これは2を出力します(AndroidではなくJava JDK):

public static void main(String[] args) {
    Locale currencyLocale = new Locale("es","CR");
    Currency currency = Currency.getInstance(currencyLocale);
    System.out.println(currency.getDefaultFractionDigits());
}
于 2012-07-16T14:10:05.063 に答える