我在使用g.message
标记解析Grails消息时发现了一些奇怪的行为。在我的属性文件中,我已定义此消息:
deleted={0} has been deleted
如果我解决此问题:
Long id = 1878L
message(code: 'festival.deleted', args: [id.toString()])
结果是:
1878年已被删除
这是我所期待的。但是,如果我用以下方法解决它:
Long id = 1878L
message(code: 'festival.deleted', args: [id])
结果是:
1,878已被删除
我不清楚为什么这个数字被格式化为" 1,878"在它被替换成消息之前。我想也许toString()
会在所有消息参数上被调用,如果它们不是String
类型的,但这似乎并不能解释这种行为,因为
id.toString() == "1878"
答案 0 :(得分:2)
g.message
标记使用Java MessageFormat生成文本输出。如果未指定参数格式,MessageFormat有几种默认的格式化参数的方法。 {0} has been deleted
说有一个论点,但没有说明如何格式化。
如果参数是String,则将字符串插入到消息中。如果参数是数字,则使用NumberFormat。
groovy:000> NumberFormat.getInstance().format(1878L)
===> 1,878
在format()
的文档中有一个很好的表格可以打破在什么情况下发生的事情。如果您想在不调用toString()
的情况下使用Long作为参数,则可以将参数更改为{0,number,#}
,这相当于
groovy:000> new DecimalFormat("#", DecimalFormatSymbols.getInstance()).format(1878L)
===> 1878