convertNumber显示0,00为负值

时间:2014-04-08 20:32:21

标签: jsf

当我尝试显示小于0的数字时:

<p:column headerText="value">
    <h:outputText value="-0,000001">
        <f:convertNumber maxFractionDigits="2" minFractionDigits="2"
            type="number" />
    </h:outputText>
</p:column>

显示-0,00

我需要将数字显示为0.00而不是-0.00

如何修复此错误?

有人知道吗?

3 个答案:

答案 0 :(得分:2)

这确实是指定的行为。这不完全是JSF的错。 <f:convertNumber>使用java.text.NumberFormat作为标准Java SE的一部分工作。没有办法通过一些神奇的NumberFormat模式或属性来克服这个问题。你真的需要求助于字符串匹配和操作。

鉴于功能要求如下:

  

当数字只包含零时,则除去减号。

解决方案是创建一个自定义转换器,扩展JSF的NumberConverter并使用必要的字符串匹配和操作作业覆盖其getAsString()

@FacesConverter("customNumberConverter")
public class CustomNumberConverter extends NumberConverter {

    public CustomNumberConverter() {
        setMinFractionDigits(2);
        setMaxFractionDigits(2);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        String converted = super.getAsString(context, component, value);

        if (converted.charAt(0) == '-' && converted.replaceAll("[^0-9]", "").matches("0+")) {
            return converted.substring(1);
        }
        else {
            return converted;
        }
    }

}

使用方法如下(请注意,您无法在单个组件上指定多个转换器,这也是我接管您最初在<f:convertNumber>上设置的属性的原因):

<h:outputText value="#{-0.000001}" converter="customNumberConverter" />

(请注意,我在EL表达式中将硬编码的数字值放在有效的double语法中(将句点作为小数分隔符);否则将其视为String而不是Number作为{{1}};它只适用于bean属性)

答案 1 :(得分:0)

考虑数学。

当一个数字小于零时,它是负数。

如果您在小数点右侧显示两位数字且数字为负数,但其值小于1/100,则该值仍为负数,但会显示为0.00。

以下是对正在发生的事情的详细演练:

  1. 你告诉JSF,&#34;我希望你输出字符串值-0.000001&#34;。
  2. 你告诉JSF,&#34;我告诉你输出的东西,把它转换成一个数字,然后输出它只有小数点右边的2位数。
  3. JSF转换&#34; -0.000001&#34;一个数字。值为负0.000001(或-0.000001)。
  4. JSF显示小数点右侧只有两位数的值,显示为&#34; -0.00&#34;。
  5. 修改

    要对您的值进行舍入,您需要实现自定义转换器或对getter中的值执行舍入。

    这是Custom Converter Tutorial

    或者如果实际页面看起来像这样:

    <h:outputText value="#{blam.blamValue}">
    

    您可以将新的getter添加到blam bean中以进行舍入。 也许导致这样的事情:

    <h:outputText value="#{blam.roundedBlamValue}">
    

    getRoundedBlamValue方法中,您需要解决java代码中的-0问题。

答案 2 :(得分:0)

这不是一个错误:数字被截断,所以你显示它的一部分,但它仍然是一个负数。 我认为问题是你认为convertNumber会对它进行舍入,但它只是将其格式化。如果你想要一个绝对0,那么之前将其舍入。