Search code examples
javabigdecimal

Removing trailing zeros from BigDecimal in Java


I need to remove trailing zeros from BigDecimal along with RoundingMode.HALF_UP. For instance,

Value        Output

15.3456  <=> 15.35
15.999   <=> 16            //No trailing zeros.
15.99    <=> 15.99
15.0051  <=> 15.01
15.0001  <=> 15           //No trailing zeros.
15.000000<=> 15           //No trailing zeros.
15.00    <=> 15           //No trailing zeros.

stripTrailingZeros() works but it returns scientific notations in situations like,

new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP).stripTrailingZeros();

In this case, it returns 6E+2. I need this in a custom converter in JSF where it might be ugly for end users. So, what is the proper way of doing this?


Solution

  • Use toPlainString()

    BigDecimal d = new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP).stripTrailingZeros();
    System.out.println(d.toPlainString()); // Printed 600 for me
    

    I'm not into JSF (yet), but converter might look like this:

    @FacesConverter("bigDecimalPlainDisplay")
    public class BigDecimalDisplayConverter implements Converter {
        @Override
        public Object getAsObject(FacesContext context, UIComponent component, String value) {
            throw new BigDecimal(value);
        }
    
        @Override
        public String getAsString(FacesContext context, UIComponent component, Object value) {
            BigDecimal  bd = (BigDecimal)value;
            return bd.setScale(2, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
        }
    }
    

    and then in xhtml:

    <h:inputText id="bigDecimalView" value="#{bigDecimalObject}" 
        size="20" required="true" label="Value">
        <f:converter converterId="bigDecimalPlainDisplay" />
    </h:inputText>