假设我有以下<f:convertNumber>
来格式化货币类型数字:
<f:convertNumber type="currency" locale="#{userSession.locale}" pattern="$###,###.###" />
在英语中,一百万将是 1,000,000,但在德国,它应该是 1.000.000。我的问题是:如果我使用上述模式,JSF 是否会知道指定语言环境的数字格式并自动使用正确的分隔符?
如果没有,如果您能告诉我如何格式化货币数字并同时指定正确的数字分隔符,我将不胜感激。
重要的是要知道并理解<f:convertNumber>
标签在幕后使用DecimalFormat
。您可以在其 javadoc 中找到所有模式字符。
您似乎期望DecimalFormat
模式字符,
和.
实际上也用于最终格式。这是不真实的。它实际上只是模式字符(如SimpleDateFormat
使用的d
、M
、y
等)。基本上,模式字符,
告诉DecimalFormat
打印给定区域设置指定的"分组分隔符",等效地,模式字符.
告诉DecimalFormat
打印给定区域设置指定的"小数分隔符"。
在效果中,打印的实际字符取决于给定的区域设置。 对于英语语言环境(locale="en"
),打印的"分组分隔符"恰好也是,
,但对于德语语言环境(locale="de"
),打印的"分组分隔符"确实是.
。
与具体问题无关,如果指定了pattern
属性,则<f:convertNumber>
的type
属性完全没有效果。在此示例中,type
属性基本上是多余的,可以安全地删除而不会产生任何副作用。
如果删除 pattern
属性,则实际会使用它,并且您将看到正在使用货币的默认模式,这与英语区域设置的¤#,##0.00
模式和德语区域设置的¤ #,##0.00
模式相同。另请注意,表示货币符号的模式字符不是$
,而是¤
。货币符号可以通过currencySymbol
属性单独设置。因此,货币的正确方法是:
<f:convertNumber type="currency" locale="#{userSession.locale}" currencySymbol="$" />
同样,请参阅之前链接的 javadoc DecimalFormat
。