我正在尝试将货币金额解析并存储为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());
}