2013-05-22 41 views
0

目前我遇到显示格式化小数的问题。在我的本地机器中,我有一个十进制值:0.002100000000存储在数据库中。DecimalFormat正被服务器设置覆盖

<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,不管区域设置如何格式化小数值?

回答

3

DecimalFormat pattern就像它的名字(和javadoc)所说的那样是一个纯粹的模式。在此模式下,,代表分组分隔符,.代表小数点分隔符。正如MMM代表SimpleDateFormat中的缩写月份(请注意,它在格式化过程中不会按月格式返回MMM,而是像MayMei(取决于语言环境))。

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

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

我不知道你正在使用的BigDecimalConverterthe standard JSF one没有getDecimalFormat()方法,所以我不能给出一个更具体的正确方法的例子。

+0

Hi BalusC,再次感谢您的答复。 BigDecimalConverter只是我们实现的一个bigdecimal faces转换器。无论如何,我收到你的回复,我完全误解了它。我想我现在可以继续前进。 – czetsuya

+0

为什么这不是来自任何地方?我使用JSP页面和Struts,并且在代码中发现了一千个我们没有正确执行此操作的地方,因为标签通常不会考虑到这一点。 –