有什么问题:
在我的应用程序中,前端的数字始终以,
作为小数分隔符显示。当用户更改其区域设置并使用?lang=en_EN
参数编辑实体时,会出现错误绑定的问题。使用en_EN
语言环境会发生什么情况,小数点分隔符为.
,它会对数据库中的输入11,00
,1100
产生值,而不是11.00
- 关于金钱的关键问题。
使用的软件:
Grails 2.3.8
Groovy 2.2.1
我想做什么:
在我的情况下,转换器中的默认“语言环境感知”方法非常有问题,我希望它们以相同的方式绑定,这应该是与语言环境无关的。
我已尝试过的内容:
我发现默认情况下的作业是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
答案 0 :(得分:5)
好的,我想我现在已经开始工作了。它基于我的代码,但也适合你。
要为ValueConverter
注册您自己的BigDecimal
,您应该将defaultGrailsBigDecimalConverter(YourBigDecimalValueConverter)
添加到 resources.groovy 。我从Grails 2.3.11的 DataBindingGrailsPlugin.groovy 中得出了这个结论。
如果您在 Config.groovy 中有grails.databinding.useSpringBinder = true
,则需要将其删除以启用Grails 2.3的新数据绑定。
我的ValueConverter
类似于您的第二个直接实现它的示例,因此请先使用该示例以尽量减少可能发生的其他问题。
这就是它的全部。我已经实现了一个ValueConverter
,它接受点和逗号作为分隔符,然后根据用户的语言环境显示它。它工作正常,棘手的部分是找出 resources.groovy 的正确名称,同时禁用Spring绑定器。