货币:小数位数意外为零



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

我做错了什么?


更新

在做了更多的研究,并向谷歌报告了这个问题后,我现在确信这是一个安卓系统的错误。谷歌的回应是,这符合预期,因为受影响的货币只能以整数倍数使用(最小的硬币是5科隆)。

谷歌的回应忽略了这样一个事实,即由于电汇、利息计算等原因,你的银行账户中可以合法地有部分金额。

不是一个真正的答案,但这打印了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());
}

最新更新