将数字传递给Grails taglibs

时间:2013-08-27 05:43:26

标签: grails

我的测试用例如下:

   void testFormattedDiv() {
    String template = """<itld:formattedDiv numerator="1" denominator="1" format="###,###" nullNotifier="-"/>"""
    String output = applyTemplate(template)
    assertEquals "0", output
}

我的taglib代码以:

开头
    def formattedDiv = {attrs, body ->
    Number numerator = attrs.get('numerator') as Number
    Number denominator = attrs.get('denominator') as Number

但是,我收到了数字格式错误。

Cannot cast object '1' with class 'java.lang.String' to class 'java.lang.Number'

传递号码的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

使用大括号(请注意,我已将模板更改为单引号而非双引号字符串,以阻止Groovy过早解释${}表达式):

    String template = '''<itld:formattedDiv numerator="${1}" denominator="${1}" format="###,###" nullNotifier="-"/>'''

使用GSP标记调用时,如果标记属性的整个内容是${}表达式,则表达式的值将直接作为其本机类型传递给标记,而不首先转换为字符串。但请注意,当属性值中包含其他内容以及${}表达式时,这不适用,例如<{1}} 转换为字符串。

答案 1 :(得分:0)

您可以添加一些代码来将字符串解析为有效数字(在taglib中)。

如果您查看FormatTagLib的来源 - 您会看到默认的grails标记库也会进行此类处理。

DecimalFormat decimalFormat = new DecimalFormat()
def numerator = attrs.get('numerator')

if (!(numerator instanceof Number)) {
    numerator = decimalFormat.parse(numerator as String)
}