我的测试用例如下:
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'
传递号码的正确方法是什么?
答案 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)
}