Grails区域设置无关的十进制数据绑定

Eel*_*Lee 4 data-binding grails

问题是什么:

在我的应用程序中,前端的数字始终,以小数点分隔符形式显示。当用户更改其区域设置并使用?lang=en_EN参数编辑实体时,发生绑定错误的问题。什么情况是,有en_EN语言环境,小数点分隔符是.使输入值11,001100在数据库中,而不是11.00-关键的问题,当涉及到钱。

使用的软件:

Grails 2.3.8
Groovy 2.2.1
Run Code Online (Sandbox Code Playgroud)

我想做的事:

在我的情况下,转换器中默认的“了解区域设置”方法非常有问题,我希望它们始终以相同的方式绑定,这应该与区域设置无关。

我已经尝试过的:

我发现默认情况下是由什么来做的LocaleAwareNumberConverter,更具体地说LocaleAwareBigDecimalConverter,是我写了一个简单的实现GERMAN,它只使用一种语言环境(在这种情况下,因为它,用作十进制分隔符)

@CompileStatic
class MyBigDecimalConverter extends LocaleAwareNumberConverter {

    @Override
    protected NumberFormat getNumberFormatter() {
        NumberFormat.getInstance(Locale.GERMAN)
    }
}
Run Code Online (Sandbox Code Playgroud)

包括在resources.groovy

myBigDecimalConverter com.company.converters.MyBigDecimalConverter
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。值仍使用进行转换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
    }
}
Run Code Online (Sandbox Code Playgroud)

而且此转换器也不会被调用。我没有对resources.groovy

小智 5

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

要注册自己ValueConverterBigDecimal,您应该添加defaultGrailsBigDecimalConverter(YourBigDecimalValueConverter)resources.groovy。我从DataBindingGrailsPlugin.groovy中获取了针对Grails 2.3.11的结论。

如果您grails.databinding.useSpringBinder = trueConfig.groovy中,则需要删除该文件以启用Grails 2.3的新数据绑定。

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

这里的所有都是它的。我已经实现了一个ValueConverter接受点和逗号作为分隔符,然后根据用户的语言环境显示它的a。它正在运行,棘手的部分是为resources.groovy找出正确的名称,同时禁用了Spring绑定器。