2014-06-11 55 views
3

我注意到使用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" 

回答

2

g.message标签使用Java的MessageFormat生成的文本输出。如果没有指定参数格式,MessageFormat有几种格式化参数的默认方式。 {0} has been deleted说有一个参数,但没有说如何格式化它。

如果参数是一个字符串,则将该字符串插入到消息中。如果参数是一个数字,则使用NumberFormat

groovy:000> NumberFormat.getInstance().format(1878L) 
===> 1,878 

有一个漂亮的表中的文档进行format(),打破了在什么情况下会发生什么。如果你要使用只要你的论点,而无需调用它toString(),你可以改变你的论点来{0,number,#}这将等同于

groovy:000> new DecimalFormat("#", DecimalFormatSymbols.getInstance()).format(1878L) 
===> 1878 
+0

我不知道,你可以包括在参数占位符的格式化信息,谢谢! –

+1

你忘了在这里提到'Locale'的重要性。 'NumberFormat.getInstance()'使用默认的语言环境。英国和美国的数字格式相同(1,878)。将语言环境更改为法语(在taglib中),您会看到数字格式的差异。所以,它是驱动格式的区域,不仅仅是'NumberFormat'。 @多纳尔 – dmahapatro