当我尝试显示小于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
如何修复此错误?
有人知道吗?
答案 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。
以下是对正在发生的事情的详细演练:
-0.000001
&#34;。要对您的值进行舍入,您需要实现自定义转换器或对getter中的值执行舍入。
或者如果实际页面看起来像这样:
<h:outputText value="#{blam.blamValue}">
您可以将新的getter添加到blam
bean中以进行舍入。
也许导致这样的事情:
<h:outputText value="#{blam.roundedBlamValue}">
在getRoundedBlamValue
方法中,您需要解决java代码中的-0问题。
答案 2 :(得分:0)
这不是一个错误:数字被截断,所以你显示它的一部分,但它仍然是一个负数。 我认为问题是你认为convertNumber会对它进行舍入,但它只是将其格式化。如果你想要一个绝对0,那么之前将其舍入。