2013-04-22 79 views
0

我想格式化正数和负数都没有任何前缀(或相同前缀)的数字。具有等价负值和负值模式的Java NumberFormat

NumberFormat的规范指出,您可以指定正数的子图案和负号的子图案,用分号分隔。

每个子模式都有一个前缀,数字部分和后缀。负面的 子模式是可选的;如果不存在,则使用 作为负子模式,而前面带有本地化减号(在大多数语言环境中为' - ')的正子模式 。也就是说,仅“0.00”等于 “0.00; -0.00”。

只要正面和负面的子模式具有不同的前缀或后缀,这就行得通了。如果它们相同,则默认为带有减号的默认行为。

我想是格式化:

  • +1为:01
  • -1为:01

我知道,我可以用Math.abs(),这是在JSP/EL环境中不是那么容易,而且这是一个纯粹的格式问题,所以应该在JSP中完成,但这根本不重要。 我无法在有关该行为的文档中找到任何提示。当我阅读上述内容时,我认为只要我指定任何负面的子模式,它就会被使用。事实并非如此。

有没有人知道这件事?我可能会向Oracle提交一个错误,但如果我错过了一些东西,首先要检查。

回答

1

不知道究竟你的格式应该是,但是这似乎为您的示例工作:

DecimalFormat f = new DecimalFormat(":00"); 
f.setNegativePrefix(":"); 
System.out.println(f.format(1)); // :01 
System.out.println(f.format(-1)); // :01 
+0

嗨,彼得,谢谢。好点,我不知道这种方法。然而,正如我所说的,我想在JSP中做到这一点(没有scriptlet),在我看来,具有分号的子模式应该是诀窍。我仍然认为,这是一个错误。该错误显然在解析和应用模式到内部结构,而不是在输出逻辑。 – marc82ch 2013-04-29 06:23:57

1

假设你在wepapp有JSTL,你可以使用以下命令:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<fmt:formatNumber pattern=":#" minIntegerDigits="2" value="${fn:replace('-1', '-', '')}" /> 

希望这个帮助...

+0

非常感谢Guillaume,这是一个很好的解决方法,但仍然有点破解,不是吗?我现在做了类似的事情,但仍然想知道这是否是一个错误? – marc82ch 2013-06-14 10:04:36