当我在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)
| 归档时间: |
|
| 查看次数: |
3124 次 |
| 最近记录: |