Java BigDecimal格式

时间:2014-12-06 17:27:00

标签: java jstl bigdecimal

我有一个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格式化吗?

3 个答案:

答案 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)

如果您可以控制格式化方法从BigDecimalString(框架显示从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);
    }
}

然后,看看如何将该格式化程序绑定到您的字段。