【问题标题】:DecimalFormat is being overridden by server settingsDecimalFormat 被服务器设置覆盖
【发布时间】:2013-05-17 05:56:24
【问题描述】:

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

【问题讨论】:

    标签: java jsf-2 converter bigdecimal


    【解决方案1】:

    DecimalFormat pattern,正如它的名字(和 javadoc)所说,是一个纯粹的模式。在此模式中,, 表示分组分隔符,. 表示小数分隔符。就像MMM 表示SimpleDateFormat 中的缩写月份一样(请注意,在格式化期间它不会将MMM 作为月份返回,但就像May 或例如Mei 取决于语言环境)。

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

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

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

    【讨论】:

    • 嗨 BalusC,再次感谢您的回复。 BigDecimalConverter 只是我们对 bigdecimal 面转换器的实现。无论如何,我得到了您的回复,但我完全误解了它。我想我现在可以继续前进了。
    • 为什么这不是从任何地方链接到的?我使用 JSP 页面和 Struts,我刚刚在我们的代码中发现了一千个地方我们没有正确执行此操作,因为 标记通常没有考虑到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多