目前,我在显示格式化的小数时遇到问题。在我的本地计算机中,我有一个十进制值: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,无论区域设置如何格式化十进制值?
该DecimalFormat模式是,正如它的名字(和javadoc)说,一个纯粹的模式。在此模式中,,代表分组分隔符,而.代表十进制分隔符。这是完全一样为MMM代表的缩写月SimpleDateFormat(注意,它不返回MMM为月格式化过程中,但就像May或者例如Mei取决于环境)。
DecimalFormat
,
.
MMM
SimpleDateFormat
May
Mei
格式化过程中,用作分组分隔符和十进制分隔符的 实际 字符(以及用作缩写月份的 实际 文本)取决于您的语言环境。这是正确的行为。如果您在创建DecimalFormat(或SimpleDateFormat)时未明确指定语言环境,则将采用默认的可用语言环境Locale#getDefault()。实际上,您应该指定一个UIViewRoot#getLocale()或固定的语言环境,例如,Locale.ENGLISH如果出于某些不清楚的原因未对JSF Web应用程序进行本地化。
Locale#getDefault()
UIViewRoot#getLocale()
Locale.ENGLISH
另请注意,DecimalFormat它(SimpleDateFormat不是)不是线程安全的(请检查javadoc中的“同步”部分)。您不应在类/实例范围内创建它,而应在线程局部范围内(即与所需位置相同的方法块中)创建它。
我不知道BigDecimalConverter您使用的是哪种,标准的JSF没有getDecimalFormat()方法,因此我无法给出适当方法的更具体的示例。
BigDecimalConverter
getDecimalFormat()