Convertir doble en cadena, eliminando decimales

1. Introducción

En este tutorial, veremos las diferentes formas de convertir un valor doble en una cadena , eliminando sus lugares decimales.

Veremos cómo hacerlo cuando solo queremos truncar la parte decimal y cuando queremos redondearla.

2. Truncamiento mediante casting

Si nuestro valor doble está dentro del rango int , podemos convertirlo en int . El reparto trunca la parte decimal, lo que significa que la corta sin hacer ningún redondeo.

Este enfoque es aproximadamente 10 veces más rápido que los otros enfoques que veremos.

Una vez que es un int, entonces podemos pasarlo al método valueOf en la clase String :

String truncated = String.valueOf((int) doubleValue);

Podemos usar este enfoque con confianza cuando tenemos la garantía de que el valor doble está dentro del rango de un int . Pero si nuestro valor supera eso, el casting no funcionará como quisiéramos .

3. Redondeo mediante String.format ()

Ahora, los enfoques restantes no son tan limitados como el casting, pero tienen sus propios matices.

Por ejemplo, otro enfoque es utilizar el método de formato de la clase String . El primer parámetro del método especifica que estamos formateando un valor de punto flotante con cero dígitos después del punto decimal:

String rounded = String.format("%.0f", doubleValue);

El método de formato utiliza el redondeo HALF_UP que se redondeará hacia arriba si el valor después de la parte fraccionaria es .5 o superior. De lo contrario, devuelve el número antes del punto decimal.

Y aunque simple, String.format es la forma más lenta de hacer esto .

4. Usando NumberFormat.format ()

La clase NumberFormat también proporciona un método de formato similar a la clase String , pero NumberFormat es más rápido y con él, podemos especificar el modo de redondeo para lograr truncamiento o redondeo.

El método setMaximumFractionDigits () le dice al formateador cuántos dígitos fraccionarios después del punto decimal incluir en la salida:

NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(0); String rounded = nf.format(doubleValue);

Curiosamente, NumberFormat no usa HALF_UP de forma predeterminada. En su lugar, utiliza el redondeo HALF_EVEN de forma predeterminada, lo que significa que se redondeará como de costumbre, excepto en .5, en cuyo caso seleccionará el número par más cercano .

Si bien HALF_EVEN es útil con el análisis estadístico, usemos HALF_UP para ser coherentes:

nf.setRoundingMode(RoundingMode.HALF_UP); String rounded = nf.format(doubleValue);

Y podemos cambiar esto y lograr el truncamiento configurando el formateador para que use el modo de redondeo FLOOR en su lugar:

nf.setRoundingMode(RoundingMode.FLOOR); String truncated = nf.format(doubleValue)

Y ahora, se truncará en lugar de redondear.

5. Usando DecimalFormat.format ()

Similar a NumberFormat , la clase DecimalFormat se puede usar para formatear valores dobles . Sin embargo, en lugar de establecer el formato de salida con llamadas a métodos, podemos decirle al formateador qué salida queremos proporcionando al constructor un patrón específico:

DecimalFormat df = new DecimalFormat("#,###"); df.setRoundingMode(RoundingMode.HALF_UP); String rounded = df.format(doubleValue);

El patrón “#, ###” significa que queremos que el formateador solo devuelva la parte entera de la entrada. También indica que queremos que los dígitos estén agrupados de tres en tres separados por una coma.

Los mismos valores predeterminados de redondeo se aplican aquí, por lo que si queremos generar un valor truncado, podemos establecer el modo de redondeo en FLOOR :

df.setRoundingMode(RoundingMode.FLOOR); String truncated = df.format(doubleValue)

6. Usando BigDecimal.toString ()

El último enfoque vamos a ver es BigDecimal , que vamos a incluir a causa de TI supera a NumberFormat y DecimalFormat para grandes dobles s .

Podemos usar BigDecimal 's setScale método para decir si queremos redonda o truncado:

double largeDouble = 345_345_345_345.56; BigDecimal big = new BigDecimal(largeDouble); big = big.setScale(0, RoundingMode.HALF_UP);

Recuerde que BigDecimal s son inmutables, así que, como Strings, necesitamos restablecer el valor.

Y, entonces, simplemente lo llamamos BigDecimal 's toString :

String rounded = big.toString();

7. Conclusión

En este tutorial, analizamos las diferentes formas en que podemos convertir un doble en una cadena mientras eliminamos los lugares decimales. Proporcionamos enfoques que generarían valores redondeados o truncados.

Como de costumbre, las muestras y los puntos de referencia están disponibles en GitHub.