Grails 与语言环境无关的十进制数据绑定(bind)

标签 grails data-binding

什么问题:

在我的应用程序中,前端的数字总是显示为 ,作为小数分隔符。当用户更改其语言环境并使用 ?lang=en_EN 编辑实体时,会出现错误绑定(bind)问题。范围。发生的事情是 en_EN语言环境,小数点分隔符为 .这使得输入值 11,00 , 1100在数据库中,而不是 11.00 - 涉及金钱的关键问题。

使用的软件:

Grails 2.3.8
Groovy 2.2.1

我想做的事:

在我的情况下,转换器中默认的“语言环境感知”方法非常有问题,我希望它们始终以相同的方式绑定(bind),这应该是独立于语言环境的。

我已经尝试过的:

我发现默认情况下使工作成为LocaleAwareNumberConverter的原因更具体地说LocaleAwareBigDecimalConverter ,所以我写了一个简单的实现,它只使用一个语言环境(在这种情况下 GERMAN ,因为它使用 , 作为小数分隔符)
@CompileStatic
class MyBigDecimalConverter extends LocaleAwareNumberConverter {

    @Override
    protected NumberFormat getNumberFormatter() {
        NumberFormat.getInstance(Locale.GERMAN)
    }
}

将其包含在 resources.groovy 中:
myBigDecimalConverter com.company.converters.MyBigDecimalConverter

但它只是行不通。值仍使用 LocaleAwareBigDecimalConverter 进行转换.

编辑 :

我已将转换器更改为直接实现 ValueConverter :
@CompileStatic
class MyBigDecimalConverter implements ValueConverter {

    @Override
    boolean canConvert(Object value) {
        value instanceof String
    }

    @Override
    Object convert(Object value) {
        def numberFormatter = NumberFormat.getInstance(Locale.GERMAN)
        numberFormatter.parse((String)value).asType(getTargetType())
    }

    @Override
    Class<?> getTargetType() {
        BigDecimal
    }
}

而且这个转换器也不会被调用。我没有对 resources.groovy 进行任何更改

最佳答案

好的,我想我现在可以正常工作了。它基于我的代码,但也应该适用于您。

注册您自己的ValueConverter对于 BigDecimal , 你应该添加 defaultGrailsBigDecimalConverter(YourBigDecimalValueConverter)到资源.groovy。我从 Grails 2.3.11 的 DataBindingGrailsPlugin.groovy 得出这个结论。

如果您有 grails.databinding.useSpringBinder = true在 Config.groovy 中,您需要删除它以启用 Grails 2.3 的新数据绑定(bind)。

我的 ValueConverter类似于您直接实现它的第二个示例,因此请先使用该示例以最大程度地减少可能发生的其他问题。

这里的所有都是它的。我已经实现了 ValueConverter它接受点和逗号作为分隔符,然后根据用户的区域设置显示它。它正在工作,棘手的部分是找出resources.groovy 的正确名称,同时禁用Spring binder。

关于Grails 与语言环境无关的十进制数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32683496/

相关文章:

data-binding - wp7 数据绑定(bind)上出现奇怪的 UnhandledException 0x8000ffff

java - 使用 WindowBuilder 与 SWT/JFace 进行数据绑定(bind)的资源

javascript - 当 customElement : true is set 时,Svelte 绑定(bind)不起作用

data-binding - 由于templateShareable :true?导致SAPUI5错误消息的解决方法

java - 选择哪个框架?

Grails shell 看不到域对象

validation - Grails中的电子邮件验证

wpf - 更新 DataTemplate 内 DataTemplate 的绑定(bind)

html - Grails 2.3.7 使用 flash.message、i18n 和 html 标记重定向 Controller 操作

grails - SubmitToRemote在Grails中不起作用