首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java BigDecimal格式

Java BigDecimal格式
EN

Stack Overflow用户
提问于 2014-12-06 17:27:00
回答 3查看 5.6K关注 0票数 1

我有一个带有BigDecimal字段的类。我把这个对象放到JSP (Spring )中。我需要在十进制中显示没有零的BigDecimal字段(20.00像20),这就是为什么我的getter方法看起来像

代码语言:javascript
复制
public BigDecimal getValue() {
    return value.stripTrailingZeros();
}

我有下一个结果:

代码语言:javascript
复制
20.50 = 20.5;
13.25 = 13.25;
30.00 = 3E+1.

如何将3E+1更改为30?我可以用Java或JSTL格式化它吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-09 21:16:41

我找到了一个简单的解决方案。它不需要在getter方法中执行stripTrailingZeros()。只是

代码语言:javascript
复制
public BigDecimal getValue() {
    return value;
}

在JSP上

代码语言:javascript
复制
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<fmt:formatNumber value="${object.value}" minFractionDigits="0"/>
票数 3
EN

Stack Overflow用户

发布于 2014-12-07 16:22:10

我认为只需在返回的大小数点上使用toPlainString()就可以了。

简单测试程序:

代码语言:javascript
复制
    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());

返回:

代码语言:javascript
复制
  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的所有变体。

代码语言:javascript
复制
  0.0 => 0.0
  0.00 => 0.00

我相信这已经在这篇堆栈溢出文章中讨论过了:正如本文所述,为什么新的BigDecimal("0.0").stripTrailingZeros()的刻度是1?已经在java 8中进行了修正(但我还没有对它进行测试)。

您可以通过执行compareTo( BigDecimal.ZERO )==0并在这种情况下使用BigDecimal.ZERO来解决这个问题。

代码语言:javascript
复制
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());
        }

返回:

代码语言:javascript
复制
  1.0==>1
  20.50==>20.5
  13.25==>13.25
  30.0==>30
  30.01000==>30.01
  0.0000=>0
票数 2
EN

Stack Overflow用户

发布于 2014-12-06 17:33:57

如果可以将格式化方法从BigDecimal控制到String (框架显示从BigDecimal.toString()返回的字符串),则可以使用NumberFormat更好地控制显示的字符串。

根据春季文献,您可以为该作业实现一个自定义格式化程序。

我建议您重写默认的NumberFormatter并重写print方法,如下所示:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27334387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档