货币:小数位数意外为零

时间:2012-07-16 13:32:00

标签: java android locale currency

我正在尝试解析并将货币金额存储为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小数。

我做错了什么?


更新

在做了一些研究之后,reporting the issue to Google,我现在确信这是一个Android错误。谷歌的回应是,这是按预期工作的,因为受影响的货币只能用于整数倍(最小硬币是5科隆)。

谷歌的回复忽略了这样一个事实,即由于电汇,利息计算等原因,您可以在银行账户中合法地获得小数金额。

1 个答案:

答案 0 :(得分: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());
}