带小数分隔符的Grails数据绑定

rat*_*tek 10 grails

当我在Double form字段上使用带有小数分隔符的grail自​​动数据绑定"ex:Test t = new Test(params)"时,我遇到了问题.经过几次搜索,我发现它与浏览器Locale有关.

示例:如果我输入小数点后用点'3.45'分隔的数字则不起作用(忽略数字的小数部分).它在我的数据库中存储3.0

如果我进行相同的测试,但使用逗号'3,45'作为小数分隔符,一切正常.Grails在数据库中存储3.45.

问题是没有人用逗号分隔符输入数字.(当设置为fr_CA时,即使小键盘输入一个点'.')

我已经找到了一些解决方案,如注册自定义数字编辑器(当你有很多应用程序时有点痛苦)或者将全局localeResolver设置为en_US(最后一个不能完成工作,因为我放弃了我的应用程序的所有国际化功能).

那么,有人有一个简单的解决方案来解决这个问题吗?

使用:Grails:2.2.0浏览器:谷歌浏览器(语言环境fr_CA)

非常感谢!

rat*_*tek 16

我一直在寻找和尝试2天.我最终选择定义一个自定义的PropertyEditorRegistar.这样,我只能为Double字段格式修复Locale.但是,我不认为它是最好的解决方案,因为它将应用于我的所有Double字段.但与此同时,它的工作做得很好.因此,如果有人有更好的解决方案,我将很乐意测试它并更新我的代码.

所以我就是这样设置的:

1 - 创建一个实现PropertyEditorRegistrar的新groovy类(如果已经有一个,只需在现有方法中添加该方法包含的部分代码)

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.beans.PropertyEditorRegistrar;
import org.springframework.beans.PropertyEditorRegistry;
import org.springframework.beans.propertyeditors.CustomNumberEditor;

public class CustomDoubleRegistrar implements PropertyEditorRegistrar {

    @Override
    public void registerCustomEditors(PropertyEditorRegistry registry) {
            //define new Double format with hardcoded Locale.ENGLISH
        registry.registerCustomEditor(Double.class, 
                 new CustomNumberEditor(Double.class, 
                           DecimalFormat.getInstance(Locale.ENGLISH),true))
    }

}
Run Code Online (Sandbox Code Playgroud)

2-将自定义注册器定义到conf/spring/resources.goovy(如果它当然不在那里)

beans = {
    customPropertyEditorRegistrar(CustomDoubleRegistrar)
}
Run Code Online (Sandbox Code Playgroud)

3-就是这样,Grails自动数据绑定工作正常

Test t = new Test(params); 
//params contains many Double fields with dot '.' as decimal delimiter
Run Code Online (Sandbox Code Playgroud)

不要犹豫,发布更好的解决方案......谢谢

编辑1

自Grails 2.3以来,此解决方案已不再有效.如果您仍想使用此解决方案,则必须将此配置添加到Config.groovy文件中

grails.databinding.useSpringBinder = true

或者实现一个新的DataBinding.我已经尝试了很少,但似乎没有解决小数分隔符问题.如果你知道如何...谢谢你发表答案

编辑2

从Grails 2.4+开始,您可以定义自己的ValueConverter以绕过基本的Locale验证.请注意,您必须删除在初始帖子和编辑1中所做的更改.以下是如何实现自定义ValueConverter:

CONF /弹簧/ resources.groovy

// Place your Spring DSL code here
beans = {
    "defaultGrailsjava.lang.DoubleConverter"(DoubleValueConverter)
}

class DoubleValueConverter implements ValueConverter {

    public LongValueConverter() {
    }

    boolean canConvert(value) {
        value instanceof Double
    }

    def convert(value) {
        //In my case returning the same value did the trick but you can define 
        //custom code that takes care about comma and point delimiter...
        return value
    }

    Class<?> getTargetType() {
        return Double.class
    }
}
Run Code Online (Sandbox Code Playgroud)