服务器设置正在覆盖DecimalFormat

时间:2013-05-22 08:50:05

标签: java jsf-2 converter bigdecimal

目前我在显示格式化小数时遇到问题。在我的本地机器上,我有一个十进制值: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,无论语言环境如何都格式化十进制值?

1 个答案:

答案 0 :(得分:3)

DecimalFormat pattern正如其名称(和javadoc)所说的那样,是一种纯粹的模式。在此模式中,,表示分组分隔符,.表示小数分隔符。这与MMM代表SimpleDateFormat中缩写的月份完全相同(请注意,在格式化过程中,它不会在月份返回MMM,但就像MayMei一样1}}取决于区域设置)。

在格式化过程中用作分组分隔符和小数点分隔符的实际字符(以及用作缩写月份的实际文本)取决于区域设置,与您观察到的完全相同。这是正确的行为。如果在创建DecimalFormat(或SimpleDateFormat)期间未明确指定区域设置,则将假定Locale#getDefault()可用的默认区域设置。如果您的JSF Web应用程序由于某些不明原因而未进行本地化,您实际上应该指定UIViewRoot#getLocale()或者可能是Locale.ENGLISH这样的固定语言环境。

另请注意,DecimalFormat(如SimpleDateFormat)不是线程安全的(请查看javadoc中的“同步”部分)。您不应该在类/实例范围中创建它,而是在线程局部范围中创建它(即在您需要它的方法块中)。

我只是不知道您使用的是哪个BigDecimalConverterthe standard JSF one没有getDecimalFormat()方法,所以我无法提供正确方法的更具体的示例