我正在尝试解析并将货币金额存储为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科隆)。
谷歌的回复忽略了这样一个事实,即由于电汇,利息计算等原因,您可以在银行账户中合法地获得小数金额。
答案 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());
}