我想使用 BigDecimal 在 grails 2.0 应用程序中存储多个货币值。
我有一个带有 BigDecimal 字段的域类
Invoice {
BigDecimal amount
}
GSP 输入表单字段类似于下一个代码片段
<div class="fieldcontain ${hasErrors(bean: invoiceInstance, field: 'amount', 'error')} required">
<label for="amount">
<g:message code="invoiceInstance.amount.label" default="Amount" />
<span class="required-indicator">*</span>
</label>
<g:field type="number" name="amount" required="" value="${invoiceInstance.amount}"/>
</div>
如果我在英语区域设置中工作,一切正常。用户在字段中输入 100,提交值时将 100.00 发送到服务器。控制器解析如下所示:
invoiceInstance.properties = params
英语区域设置的 BigDecimal 金额 100.00 按预期为 100 欧元
问题是,如果用户将区域设置更改为西班牙语并在字段中输入 100。字符串 100.00 被发送到服务器,但解析集的数量为 10000,因为它知道西班牙语数字的小数分隔符是 和 。是千位分隔符。
如何避免此问题?
在通过检查接受语言标头分析值之前,可能需要检查用户的区域设置。与其天真地从参数构造,不如使用标头引用的区域设置中传递的值创建一个new BigDecimal
。
有几年了,但在Grails 4.1.1中仍然发生同样的事情。您可以通过显式绑定字段值来避免此问题,例如:
invoiceInstance.amount = new BigDecimal(params['amount'] as String)