gpt4 book ai didi

带十进制分隔符的 Grails 数据绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 03:12:21 25 4
gpt4 key购买 nike

当我在 Double 表单字段上使用带有小数分隔符的 grail 自动数据绑定(bind)“ex:Test t = new Test(params)”时遇到问题。经过几次搜索,我发现它与浏览器区域设置有关。

例子 :
如果我输入的小数点用点“3.45”分隔,则它不起作用(数字的小数部分被忽略)。它在我的数据库中存储 3.0

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

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

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

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

使用:
chalice :2.2.0
浏览器:谷歌浏览器(地区 fr_CA)

非常感谢!

最佳答案

我一直在寻找和尝试 2 天。我最终选择定义一个自定义的 PropertyEditorRegistar。这样,我可以仅修复双字段格式的区域设置。但是,我认为这不是最好的解决方案,因为它将应用于我的所有 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))
}

}

2- 将自定义注册器定义到 conf/spring/resources.goovy 中(当然,如果它还没有的话)
beans = {
customPropertyEditorRegistrar(CustomDoubleRegistrar)
}

3-就是这样,Grails自动数据绑定(bind)可以正常工作
Test t = new Test(params); 
//params contains many Double fields with dot '.' as decimal delimiter

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

编辑 1

从 Grails 2.3 开始,这个解决方案不再有效。如果你仍然想使用这个方案,你必须把这个配置添加到 Config.groovy 文件中

grails.databinding.useSpringBinder = true

或实现新的 DataBinding 之一.我已经尝试了其中的一些,但似乎没有任何东西可以解决小数分隔符问题。如果您知道如何发布答案,谢谢...

编辑 2

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

conf/spring/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
}
}

关于带十进制分隔符的 Grails 数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14877602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com