<f:convertNumber> 在使用模式格式化货币时是否使用正确的数字分隔符?



假设我有以下<f:convertNumber>来格式化货币类型数字:

<f:convertNumber type="currency" locale="#{userSession.locale}" pattern="$###,###.###" />
在英语中,一百万将是 1,000,000,

但在德国,它应该是 1.000.000。我的问题是:如果我使用上述模式,JSF 是否会知道指定语言环境的数字格式并自动使用正确的分隔符?

如果没有,如果您能告诉我如何格式化货币数字并同时指定正确的数字分隔符,我将不胜感激。

重要的是要知道并理解<f:convertNumber>标签在幕后使用DecimalFormat。您可以在其 javadoc 中找到所有模式字符。

您似乎期望DecimalFormat模式字符,.实际上也用于最终格式。这是不真实的。它实际上只是模式字符(如SimpleDateFormat使用的dMy等)。基本上,模式字符,告诉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

相关内容

最新更新