without scientific quitar notacion cientifica java bigdecimal

scientific - quitar notacion cientifica javascript



Eliminar ceros finales de BigDecimal en Java (6)

Debe hacer algunos cálculos en BigDecimal, y luego redondearlo a la mitad, por ejemplo

BigDecimal toPay = new BigDecimal(1453.00005); toPay = toPay.multiply(new BigDecimal(1)).setScale(2, RoundingMode.HALF_UP)

Funcionó para mí

Necesito eliminar los ceros finales de BigDecimal junto con RoundingMode.HALF_UP . Por ejemplo,

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() funciona pero devuelve notaciones científicas en situaciones como,

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

En este caso, devuelve 6E+2 . Lo necesito en un convertidor personalizado en JSF, donde podría ser feo para los usuarios finales. Entonces, ¿cuál es la forma correcta de hacer esto?


Puedes usar DecimalFormat . Por ejemplo:

BigDecimal value = new BigDecimal("15.3456").setScale(2, BigDecimal.ROUND_HALF_UP)); String valueString = new DecimalFormat("#.##").format(value); System.out.println(valueString); //15.35

Por favor inténtalo.


Si desea hacer esto en su objeto BigDecimal y no convertirlo en una cadena con un formateador, puede hacerlo en Java 8 con 2 pasos:

  1. stripTrailingZeros ()
  2. if scale <0 setScale a 0 si no le gusta la notación científica / científica

Puede probar este fragmento para comprender mejor el comportamiento

BigDecimal bigDecimal = BigDecimal.valueOf(Double.parseDouble("50")); bigDecimal = bigDecimal.setScale(2); bigDecimal = bigDecimal.stripTrailingZeros(); if (bigDecimal.scale()<0) bigDecimal= bigDecimal.setScale(0); System.out.println(bigDecimal);//50 bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20")); bigDecimal = bigDecimal.setScale(2); bigDecimal = bigDecimal.stripTrailingZeros(); if (bigDecimal.scale()<0) bigDecimal= bigDecimal.setScale(0); System.out.println(bigDecimal);//50.2 bigDecimal = BigDecimal.valueOf(Double.parseDouble("50")); bigDecimal = bigDecimal.setScale(2); bigDecimal = bigDecimal.stripTrailingZeros(); System.out.println(bigDecimal);//5E+1 bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20")); bigDecimal = bigDecimal.setScale(2); bigDecimal = bigDecimal.stripTrailingZeros(); System.out.println(bigDecimal);//50.2


También puede lograr esto con String.format() , así:

final BigDecimal b = new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP); String f = String.format("%.0f", b); System.out.println(f); //600


Tenga en cuenta que stripTrailingZeros() tampoco funciona muy bien.

En este:

val = new BigDecimal("0.0000").stripTrailingZeros(); System.out.println(val + ": plain=" + val.toPlainString()); val = new BigDecimal("40.0000").stripTrailingZeros(); System.out.println(val + ": plain=" + val.toPlainString()); val = new BigDecimal("40.50000").stripTrailingZeros(); System.out.println(val + ": plain=" + val.toPlainString());

Salida (Java 7):

0.0000: plain=0.0000 4E+1: plain=40 40.5: plain=40.5

Salida (Java 8):

0: plain=0 4E+1: plain=40 40.5: plain=40.5

El problema de 0.0000 en Java 7 se corrige en Java 8 con el siguiente arreglo de java .


Usar toPlainString()

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

No estoy en JSF (todavía), pero el convertidor podría verse así:

@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(); } }

y luego en xhtml:

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