2014-06-11 99 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