如何在考虑当前用户 Locale 的情况下解析 Grails 控制器中的 BigDecimal



我想使用 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)

相关内容

最新更新