小编典典

服务器设置将覆盖DecimalFormat

java

目前,我在显示格式化的小数时遇到问题。在我的本地计算机中,我有一个十进制值: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,无论区域设置如何格式化十进制值?


阅读 243

收藏
2020-11-30

共1个答案

小编典典

DecimalFormat模式是,正如它的名字(和javadoc)说,一个纯粹的模式。在此模式中,,代表分组分隔符,而.代表十进制分隔符。这是完全一样为MMM代表的缩写月SimpleDateFormat(注意,它不返回MMM为月格式化过程中,但就像May或者例如Mei取决于环境)。

格式化过程中,用作分组分隔符和十进制分隔符的 实际 字符(以及用作缩写月份的 实际
文本)取决于您的语言环境。这是正确的行为。如果您在创建DecimalFormat(或SimpleDateFormat)时未明确指定语言环境,则将采用默认的可用语言环境Locale#getDefault()。实际上,您应该指定一个UIViewRoot#getLocale()或固定的语言环境,例如,Locale.ENGLISH如果出于某些不清楚的原因未对JSF
Web应用程序进行本地化。

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

我不知道BigDecimalConverter您使用是哪种,标准的JSF没有getDecimalFormat()方法,因此我无法给出适当方法的更具体的示例。

2020-11-30