如何更改GRAILS GSP fieldValue格式化整数的方式?

如何更改GRAILS GSP fieldValue格式化整数的方式?,grails,gsp,Grails,Gsp,我的域对象中有一个字段,我将其定义为整数 Integer minPrice 然后,我在GSP页面中访问它,如下所示: ${fieldValue(bean: myBean, field: 'minPrice')} <g:select name="minPrice" value="${fieldValue(bean: personInstance, field: 'minPrice')}" onchange="setDirty()" noSelection='${['0':'Sele

我的域对象中有一个字段,我将其定义为整数

Integer minPrice
然后,我在GSP页面中访问它,如下所示:

${fieldValue(bean: myBean, field: 'minPrice')}
<g:select name="minPrice" 
value="${fieldValue(bean: personInstance, field: 'minPrice')}"  
onchange="setDirty()"
noSelection='${['0':'Select a number...']}'
from="${[
    ['name':'100,000', 'id':'100,000'],
    ['name':'200,000', 'id':'200,000'],
    ['name':'300,000', 'id':'300,000']
    ]}"
optionKey="id" optionValue="name"
/>
我在HTML中得到的是

100,000
它不是整数,而是字符串。更糟糕的是,它是特定区域设置中的格式化字符串

这是一个问题,因为我在HTML表单上有一个SELECT控件,它有一个minPrice的(非顺序)值范围,我想将它作为整数存储在我的域对象中,我不想存储一个指向某个值数组的索引,我必须在这些值之间反复映射,我想要值本身

我的选择控件看起来像这样

<g:select name="minPrice" 
value="${fieldValue(bean: personInstance, field: 'minPrice')}"  
onchange="setDirty()"
noSelection='${['0':'Select a number...']}'
from="${[
    ['name':'100,000', 'id':100000],
    ['name':'200,000', 'id':200000],
    ['name':'300,000', 'id':300000]
    ]}"
optionKey="id" optionValue="name"
/>
var x = <g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />;
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
var y = <fmt:formatNumber value="${fieldValue(bean: personInstance, field: 'minPrice')}" pattern=".00"/>;
我从页面编译器中得到一个错误,
无法将给定对象格式化为数字

我想我有一个更广泛的担忧,就是如果由于fieldValue指令的默认(且不可配置)行为,整数值大于999,我似乎无法将其作为真正的整数输入到代码中。然而,我无法在select控件中预先选择整数值的具体问题并没有消失。目前我有点不知所措


有人有进一步的想法吗?

我想你至少有两种可能的解决方案

一种是使用JSTL标记库,如中所述

另一个更酷的方法是使用grails中包含的'formatNumber'标记,也可以在中使用

出于您的目的,该标记的使用可能如下所示:

<g:formatNumber number="${fieldValue(bean: myBean, field: 'minPrice')}" format="######" />

我有一个解决方案/工作循环。。。答案似乎是“什么也不做”

我没有尝试将字符串化的数字解析回整数,而是将其保留为格式化字符串,以便进行选择。这意味着我必须将我的
值从
更改如下:

${fieldValue(bean: myBean, field: 'minPrice')}
<g:select name="minPrice" 
value="${fieldValue(bean: personInstance, field: 'minPrice')}"  
onchange="setDirty()"
noSelection='${['0':'Select a number...']}'
from="${[
    ['name':'100,000', 'id':'100,000'],
    ['name':'200,000', 'id':'200,000'],
    ['name':'300,000', 'id':'300,000']
    ]}"
optionKey="id" optionValue="name"
/>

当然,当我发回服务器时,发送的值是作为转义字符串的“100000”。我意识到Grails、Spring、Hibernate或堆栈中的某些东西会在持久化之前将字符串重新组合成正确的整数类型

就我的目的而言,这很好,但是我认为这基本上是一个工作循环,而不是一个解决方案,因为存在区域设置问题。如果我的千位分隔符是“.”而我的十进制分隔符是“,”,这在欧洲大部分地区都适用,那么我的代码就不起作用了。

最好使用它,以免每次输出值时都麻烦使用
formatNumber
标记。 比如,在resources.groovy中声明一个bean:

myOwnCustomEditorRegistrar(CustomEditorRegistrar)
并创建您的类:

class CustomEditorRegistrar implements PropertyEditorRegistrar {
    void registerCustomEditors(PropertyEditorRegistry registry) {
        registry.registerCustomEditor(BigDecimal.class, new MyBigDecimalEditor(BigDecimal.class))
    }
}

是否要显示原始编号?大约10万

您可以直接获取该字段:

${myBean.minPrice}
改变

var x = <g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />;
varx=;

varx=;

将“groupingUsed”属性与您的格式结合使用:

<g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" 
                format="#" 
                groupingUsed="true" />

我发现处理这个问题的最好方法是按照Victor Sergienko(顺便提一下)的暗示使用PropertyEditor

为Integer创建一个编辑器,放入src/groovy:

class IntegerEditor extends PropertyEditorSupport {
    void setAsText(String s) {
        if (s) value = s as Integer
    }

    public String getAsText() {
        value
    }
}
class MyEditorRegistrar implements PropertyEditorRegistrar {
    public void registerCustomEditors(PropertyEditorRegistry reg) {
        reg.registerCustomEditor(Integer, new IntegerEditor())
    }
}
并使用PropertyEditorRegistrar(也在src/groovy中)注册它:

将注册器添加到spring配置中(grails-app/conf/spring/resource.groovy):

从现在起,任何绑定、接收错误(或未接收)然后使用fieldValue标记重新显示的整数都应该由Integer的默认toString显示-您可以通过修改getAsText实现在编辑器中自定义此行为

就我个人而言,我会为这类东西创建一个包装器,这样您就可以为该类型设置一个编辑器,而不是为一个常用类型设置一个全面的编辑器。虽然我意识到这意味着在持久化到DB时需要进行一点映射…

如下使用:
Use like this :
<g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}"
 format="#.##"/>;
;
我无法使这两种解决方案都起作用。。。请参见上面的编辑。回想起来,很明显,如果这是纯Java,我不需要数字格式化程序,我需要Integer.parseInt()将fieldValue的结果返回到正确的类型。这不可能这么难。。。我做错了什么。如果您直接使用${bean.value}显示它-您将失去显示未通过验证的值的功能!另请参见本页的最后一条评论
Use like this :
<g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}"
 format="#.##"/>;