目前我在显示格式化小数时遇到问题。在我的本地机器上,我有一个十进制值:0.002100000000存储在数据库中。
<h:outputText value="0.002100000000" converter="#{bigDecimal4DigitsConverter}" />
@FacesConverter("bigDecimal4DigitsConverter")
public class BigDecimal4DigitsConverter extends BigDecimalConverter {
private DecimalFormat format = new DecimalFormat("#,##0.0000");
@Override
protected DecimalFormat getDecimalFormat() {
return format;
}
}
我的问题是在我显示的本地计算机上: 0.0021 - 美国设置 但在另一台服务器 0,0021 - 法语设置
为什么?我认为DecimalFormat,无论语言环境如何都格式化十进制值?
答案 0 :(得分:3)
DecimalFormat
pattern正如其名称(和javadoc)所说的那样,是一种纯粹的模式。在此模式中,,
表示分组分隔符,.
表示小数分隔符。这与MMM
代表SimpleDateFormat
中缩写的月份完全相同(请注意,在格式化过程中,它不会在月份返回MMM
,但就像May
或Mei
一样1}}取决于区域设置)。
在格式化过程中用作分组分隔符和小数点分隔符的实际字符(以及用作缩写月份的实际文本)取决于区域设置,与您观察到的完全相同。这是正确的行为。如果在创建DecimalFormat
(或SimpleDateFormat
)期间未明确指定区域设置,则将假定Locale#getDefault()
可用的默认区域设置。如果您的JSF Web应用程序由于某些不明原因而未进行本地化,您实际上应该指定UIViewRoot#getLocale()
或者可能是Locale.ENGLISH
这样的固定语言环境。
另请注意,DecimalFormat
(如SimpleDateFormat
)不是线程安全的(请查看javadoc中的“同步”部分)。您不应该在类/实例范围中创建它,而是在线程局部范围中创建它(即在您需要它的方法块中)。
我只是不知道您使用的是哪个BigDecimalConverter
,the standard JSF one没有getDecimalFormat()
方法,所以我无法提供正确方法的更具体的示例