0

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

4

1 回答 1

3

正如其名称(和 javadoc)所说,该DecimalFormat模式是一种纯模式。在此模式中,,代表分组分隔符,.代表小数分隔符。MMM它与表示缩写月份的月份完全相同SimpleDateFormat(请注意,在格式化期间它不会返回MMM月份,而是May取决于Mei语言环境)。

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

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

我只是不知道BigDecimalConverter你在使用哪个,标准的 JSF没有getDecimalFormat()方法,所以我不能给出一个更具体的例子来说明正确的方法。

于 2013-05-22T13:14:04.677 回答