2014-12-06 92 views
1

我有BigDecimal的领域类。我把这个对象放到JSP(Spring MVC)中。我需要无零十进制(20.00喜欢20)显示BigDecimal的领域,这就是为什么我的getter方法看起来像Java的BigDecimal的格式化

public BigDecimal getValue() { 
    return value.stripTrailingZeros(); 
} 

和我有一个结果:

20.50 = 20.5; 
13.25 = 13.25; 
30.00 = 3E+1. 

我怎样才能改变3E +1至30?我可以使用Java或JSTL格式化它吗?

回答

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"/> 
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); 
    } 
} 

然后,看你怎么可以是格式化绑定到你的领域。

+0

感谢您的回答,但我不希望重写序列化。我想知道是否有一些方法可以在服务器或用户界面上对其进行格式化。 – AlexSmith 2014-12-07 14:06:32

+1

@AlexSmith它不是重写序列化,它覆盖了框架上的转换策略。 – Kleyguerth 2014-12-07 15:10:39

2

我想你可以逃脱只是使用toPlainString()的返回的BigDecimal。

简单的测试程序:

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 

只有一个边界的情况下,我知道,这是行不通的for..and是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