我有一个BigDecimal字段的类。我将此对象放到JSP(Spring MVC)中。我需要显示BigDecimal字段,不带十进制零(20.00,如20),这就是为什么我的getter方法看起来像
public BigDecimal getValue() {
return value.stripTrailingZeros();
}
我有下一个结果:
20.50 = 20.5;
13.25 = 13.25;
30.00 = 3E+1.
如何将3E + 1更改为30?我可以用Java或JSTL格式化吗?
答案 0 :(得分:3)
我找到了一个简单的解决方案。它不需要在getter方法中执行stripTrailingZeros()。只是
public BigDecimal getValue() {
return value;
}
关于JSP
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:formatNumber value="${object.value}" minFractionDigits="0"/>
答案 1 :(得分:2)
我认为你可以通过在返回的bigdecimal上使用toPlainString()来逃脱。
简单的测试程序:
BigDecimal[] bds={new BigDecimal("1.0"),new BigDecimal("20.50"),
new BigDecimal("13.25"),
new BigDecimal("30.0"),
new BigDecimal("30.01000"), new BigDecimal("0.0000")
};
for (BigDecimal bd: bds)
System.out.println(bd+"==>"+bd.stripTrailingZeros().toPlainString());
返回:
1.0==>1
20.50==>20.5
13.25==>13.25
30.0==>30
30.01000==>30.01
0.0000==>0.0000
只有一个边界情况,我知道它不适用于......并且所有变体都是0。
0.0 => 0.0
0.00 => 0.00
我相信这个堆栈溢出文章已经涵盖了这一点:Why does new BigDecimal("0.0").stripTrailingZeros() have a scale of 1? 根据文章,这在java 8中已得到纠正(但我尚未对其进行测试)。
您可以通过执行compareTo(BigDecimal.ZERO)== 0并在这种情况下使用BigDecimal.ZERO来逃避它。
BigDecimal[] bds={new BigDecimal("1.0"),
new BigDecimal("20.50"),
new BigDecimal("13.25"),
new BigDecimal("30.0"),
new BigDecimal("30.01000"),
new BigDecimal("0.0000")
};
for (BigDecimal bd: bds){
if (bd.compareTo(BigDecimal.ZERO) == 0){
System.out.println(bd+"=>"+BigDecimal.ZERO);
}
else {
System.out.println(bd+"==>"+bd.stripTrailingZeros().toPlainString());
}
返回:
1.0==>1
20.50==>20.5
13.25==>13.25
30.0==>30
30.01000==>30.01
0.0000=>0
答案 2 :(得分:0)
如果您可以控制格式化方法从BigDecimal
到String
(框架显示从BigDecimal.toString()返回的字符串),您可以使用NumberFormat更好地控制显示的字符串。
根据Spring documentation,您可以为该作业实现自定义格式化程序。
我建议您覆盖默认的NumberFormatter
并覆盖print
方法,如下所示:
public class NoZeroesBigDecimalFormatter extends org.springframework.format.number.NumberFormatter{
@Override
public String print(Number number, Locale locale) {
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(5); //whatever value is your maximum displayed digits
return nf.format(value);
}
}
然后,看看如何将该格式化程序绑定到您的字段。