2014-12-06 163 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