转换数字显示 0,00 作为负值

  • 本文关键字:数字显示 转换 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

如何修复此错误?

有人知道吗?

这确实是指定的行为。这并不完全是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;它仅适用于 Bean 属性)。

这不是一个错误:数字被截断,所以你显示它的一部分,但它仍然是一个负数。我认为问题是你认为转换数字四舍五入它,但它只是格式化它。如果你想要一个绝对的 0,那么在前面四舍五入。

考虑数学。

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

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

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

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

编辑

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

这是一个自定义转换器教程

或者,如果实际页面如下所示:

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

您可以在blam豆中添加一个新的吸气剂。也许会导致这样的事情:

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

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

相关内容

  • 没有找到相关文章

最新更新