0

我的测试用例如下所示:

   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'

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

4

2 回答 2

2

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

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

对于 GSP 标签调用,如果标签属性的全部内容是一个${}表达式,那么表达式的值将直接作为其原生类型传递给标签,而无需先转换为字符串。但是请注意,当属性值和表达式中还有其他内容时,这并不适用${},例如ex="${ample}_1" 被转换为字符串。

于 2013-08-27T07:54:34.567 回答
0

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

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

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

if (!(numerator instanceof Number)) {
    numerator = decimalFormat.parse(numerator as String)
}
于 2013-08-27T06:31:49.130 回答