Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务器设置正在覆盖DecimalFormat_Java_Jsf 2_Converter_Bigdecimal - Fatal编程技术网

Java 服务器设置正在覆盖DecimalFormat

Java 服务器设置正在覆盖DecimalFormat,java,jsf-2,converter,bigdecimal,Java,Jsf 2,Converter,Bigdecimal,目前我在显示格式化的小数时遇到问题。在我的本地机器中,我有一个十进制值:0.0021000000存储在数据库中 <h:outputText value="0.002100000000" converter="#{bigDecimal4DigitsConverter}" /> @FacesConverter("bigDecimal4DigitsConverter") public class BigDecimal4DigitsConverter extends BigDecimalC

目前我在显示格式化的小数时遇到问题。在我的本地机器中,我有一个十进制值:0.0021000000存储在数据库中

<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;
    }
}

@FacesConverter(“BigDecimal4数字转换器”)
公共类BigDecimal4数字转换器扩展BigDecimalConverter{
私有DecimalFormat=新的DecimalFormat(“0.0000”);
@凌驾
受保护的DecimalFormat getDecimalFormat(){
返回格式;
}
}
我的问题在本地计算机上,它显示: 0.0021-美国设置 但是在另一台服务器上 00021-法语设置

为什么呢?我认为DecimalFormat,不管语言环境如何格式化十进制值?

正如它的名字(和javadoc)所说,它是一种纯模式。在此模式中,
表示分组分隔符,
表示十进制分隔符。这与
MMM
表示中的缩写月份完全相同(请注意,在格式化过程中,它不会将
MMM
作为月份返回,而与
May
或例如
Mei
一样,具体取决于区域设置)

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

还请注意,
DecimalFormat
不是线程安全的(如
SimpleDateFormat
)。您不应该在类/实例范围内创建它,而应该在线程本地范围内创建它(即,在您需要它的同一个方法块中)

我不知道您正在使用的
BigDecimalConverter
没有
getDecimalFormat()
方法,因此我无法给出更具体的正确方法示例。

正如它的名字(和javadoc)所说,它是一个纯模式。在此模式中,
表示分组分隔符,
表示十进制分隔符。这与
MMM
表示中的缩写月份完全相同(请注意,在格式化过程中,它不会将
MMM
作为月份返回,而与
May
或例如
Mei
一样,具体取决于区域设置)

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

还请注意,
DecimalFormat
不是线程安全的(如
SimpleDateFormat
)。您不应该在类/实例范围内创建它,而应该在线程本地范围内创建它(即,在您需要它的同一个方法块中)


我不知道您使用的是哪个
BigDecimalConverter
,没有
getDecimalFormat()
方法,因此我无法给出更具体的正确方法示例。

你好,巴卢斯克,再次感谢您的回复。BigDecimalConverter只是我们实现的BigDecimalFaces转换器。不管怎样,我得到了你的回应,我完全误解了。我想我现在可以继续前进了。为什么这不能与来自世界各地的信息联系起来?我使用JSP页面和Struts,我刚刚在代码中发现了上千个地方我们做得不好,因为和标记通常没有考虑到这一点。嗨,BalusC,再次感谢您的回复。BigDecimalConverter只是我们实现的BigDecimalFaces转换器。不管怎样,我得到了你的回应,我完全误解了。我想我现在可以继续前进了。为什么这不能与来自世界各地的信息联系起来?我使用JSP页面和Struts,我刚刚发现代码中有上千个地方没有正确地执行此操作,因为和标记通常没有考虑到这一点。