5

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

Integer minPrice

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

${fieldValue(bean: myBean, field: 'minPrice')}

我在 HTML 中得到的是……

100,000

这不是整数,而是字符串。更糟糕的是,它是特定语言环境中的格式化字符串。

这是一个问题,因为我在 HTML FORM 上有一个 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"
/>

当我从 SELECT 字段中获取值以将其发回服务器时,它正确地具有一个整数值,我将其保留。但是,回程永远不会在下拉列表中预先选择正确的行,因为该值是这个逗号分隔的字符串。

对于逗号格式不起作用的小数字,这在我的代码的其他地方可以正常工作,并且往返 SELECT 是成功的。但是值 >999 不起作用。

文档说“这个标签将检查一个作为数据绑定主题的 bean,并从数据绑定期间填充的 bean 错误对象中包含的最初提交的值或从 bean 属性的值中获取字段的值。一旦获得该值,它将自动进行 HTML 编码。”

这是我要避免的最后一点,因为它似乎格式化整数。那么,我需要了解多少 Grails/GSP 魔法才能让我的 Integer 以整数形式呈现到我的 SELECT 中并预先选择正确的行?

编辑: 我根据下面的答案尝试了一些进一步的事情,到目前为止结果相当令人失望......

如果我将<gformatNumber/>标签放在我的标签中,我<g:select/>会在浏览器中将页面代码作为文本获取。

<g:select name="minPrice" 
value='<g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />'
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"
/>

像这样在我的整数值 100000 上使用 GSP 中的数字格式标签...

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

100. 请记住,fieldValue回馈100,000,所以这并不奇怪。

如果我像这样使用jsp taglib ...

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
var y = <fmt:formatNumber value="${fieldValue(bean: personInstance, field: 'minPrice')}" pattern=".00"/>;

我从页面编译器得到一个错误Cannot format given Object as a Number

我想我有一个更广泛的担忧,而不是因为 fieldValue 指令的默认(和不可配置)行为,如果它大于 999,我似乎无法将整数值作为真正的整数放入我的代码中。但是,我无法在 SELECT 控件中预先选择整数值的具体问题并没有消失。目前我有点茫然。

任何人有任何进一步的想法?

4

8 回答 8

8

你想显示原始数字吗?像100000?

您可以直接获取该字段:

${myBean.minPrice}
于 2010-12-15T18:41:06.047 回答
5

我认为您至少有两种可能的解决方案。

一种是使用文档中描述的 JSTL taglib 。

另一种更酷的方法是使用 grails 中包含的“formatNumber”标签 - 也在docs中。

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

<g:formatNumber number="${fieldValue(bean: myBean, field: 'minPrice')}" format="######" />
于 2010-01-21T11:48:13.950 回答
3

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

<g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" 
                format="#" 
                groupingUsed="true" />
于 2011-05-25T20:12:07.907 回答
3

最好使用自定义 PropertyEditor,以免formatNumber每次输出值时都为标签而烦恼。比如,在 resources.groovy 中声明一个 bean:

myOwnCustomEditorRegistrar(CustomEditorRegistrar)

并创建您的课程:

class CustomEditorRegistrar implements PropertyEditorRegistrar {
    void registerCustomEditors(PropertyEditorRegistry registry) {
        registry.registerCustomEditor(BigDecimal.class, new MyBigDecimalEditor(BigDecimal.class))
    }
}
于 2010-12-14T14:40:02.730 回答
1

改变

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

var x = <g:formatNumber number="${personInstance.minPrice}" format="#" />;
于 2011-03-11T05:34:18.060 回答
1

我发现处理这个问题的最好方法是做 Victor Sergienko(顺便说一句)暗示的使用 PropertyEditor。

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

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

    public String getAsText() {
        value
    }
}

并使用 PropertyEditorRegistrar 注册它(也在 src/groovy 中):

class MyEditorRegistrar implements PropertyEditorRegistrar {
    public void registerCustomEditors(PropertyEditorRegistry reg) {
        reg.registerCustomEditor(Integer, new IntegerEditor())
    }
}

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

beans = {
    customEditorRegistrar(MyEditorRegistrar)
}

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

就我个人而言,我会为这种事情创建一个包装器,这样您就可以为该类型设置一个编辑器,而不是为常用类型设置一个编辑器。虽然我意识到这意味着在持久化到数据库时需要进行一些映射......

于 2012-08-30T13:06:19.213 回答
0

我有一个解决方案/解决方法......答案似乎是,“什么都不做”。

为了选择的目的,我没有尝试将字符串化的数字解析回整数,而是将其保留为格式化字符串。这意味着我必须改变我的from价值观如下:

<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"
/>

当然,当我发回服务器时,发送的值是“100,000”作为转义字符串。我意识到 Grails、Spring、Hibernate 或堆栈中的某些东西会在持久化之前将 String 强制转换回正确的 Integer 类型。

这对我的目的来说很好,但是由于语言环境问题,我认为它基本上是一个工作循环而不是一个解决方案。如果我的千位分隔符是“。” 我的小数分隔符是“,”,它适用于欧洲大部分地区,那么我的代码将无法工作。

于 2010-01-22T10:20:26.270 回答
0
Use like this :
<g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}"
 format="#.##"/>;
于 2013-12-23T04:06:01.150 回答