当我尝试像这样显示小于 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。
以下是正在发生的事情的详细演练:
- 你
- 告诉 JSF,"我希望你输出字符串值
-0.000001
"。 - 你告诉JSF,"我告诉你输出的那个东西,把它转换成一个数字,然后输出它,小数点右边只有2位数字。
- JSF 将"-0.000001"转换为数字。 该值为负 0.000001(或 -0.000001)。
- JSF 显示小数点后右边只有两位数字的值,显示为"-0.00"。
编辑
要对值执行舍入,您需要实现自定义转换器或对 getter 中的值执行舍入。
这是一个自定义转换器教程
或者,如果实际页面如下所示:
<h:outputText value="#{blam.blamValue}">
您可以在blam
豆中添加一个新的吸气剂。也许会导致这样的事情:
<h:outputText value="#{blam.roundedBlamValue}">
在getRoundedBlamValue
方法中,您需要解决 Java 代码中的 -0 问题。