Converti Double in String, rimuovendo le posizioni decimali

1. Introduzione

In questo tutorial, daremo uno sguardo ai diversi modi per convertire un valore double in una stringa , rimuovendo le sue posizioni decimali.

Vedremo come farlo quando vogliamo solo troncare la parte decimale e quando vogliamo arrotondarla.

2. Troncamento tramite Casting

Se il nostro valore double è compreso nell'intervallo int , possiamo lanciarlo a un int . Il cast tronca la parte decimale, il che significa che la taglia senza eseguire alcun arrotondamento.

Questo approccio è circa 10 volte più veloce degli altri approcci che esamineremo.

Una volta che è un int, possiamo quindi passarlo al metodo valueOf sulla classe String :

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

Possiamo utilizzare questo approccio con sicurezza quando ci viene garantito che il valore double è compreso nell'intervallo di un int . Ma se il nostro valore lo supera, il casting non funzionerà come vorremmo .

3. Arrotondamento utilizzando String.format ()

Ora, gli approcci rimanenti non sono limitati come il casting, ma hanno le loro sfumature.

Ad esempio, un altro approccio consiste nell'usare il metodo format della classe String . Il primo parametro del metodo specifica che stiamo formattando un valore in virgola mobile con zero cifre dopo il punto decimale:

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

Il metodo di formattazione utilizza l' arrotondamento HALF_UP che verrà arrotondato per eccesso se il valore dopo la parte frazionaria è .5 o superiore. In caso contrario, restituisce il numero prima del punto decimale.

E sebbene semplice, String.format è il modo più lento per farlo .

4. Utilizzo di NumberFormat.format ()

La classe NumberFormat fornisce anche un metodo di formattazione simile alla classe String , ma NumberFormat è più veloce e con esso possiamo specificare la modalità di arrotondamento per ottenere il troncamento o l'arrotondamento.

Il metodo setMaximumFractionDigits () indica al formattatore quante cifre frazionarie dopo il punto decimale includere nell'output:

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

Curiosamente, NumberFormat non usa HALF_UP per impostazione predefinita. Invece, utilizza l' arrotondamento HALF_EVEN per impostazione predefinita, il che significa che verrà arrotondato normalmente tranne a .5, nel qual caso sceglierà il numero pari più vicino .

Sebbene HALF_EVEN sia utile con l'analisi statistica, utilizziamo HALF_UP per essere coerenti:

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

E possiamo cambiarlo e ottenere il troncamento impostando il formattatore per utilizzare invece la modalità di arrotondamento FLOOR :

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

E ora troncerà invece di arrotondare.

5. Utilizzo di DecimalFormat.format ()

Simile a NumberFormat , la classe DecimalFormat può essere utilizzata per formattare i valori double . Tuttavia, invece di impostare il formato di output con le chiamate al metodo, possiamo dire al formattatore quale output vogliamo fornendo al costruttore uno schema specifico:

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

Il pattern "#, ###" significa che vogliamo che il formattatore restituisca solo la parte intera dell'input. Segnala anche che vogliamo che le cifre siano raggruppate in tre separate da una virgola.

Gli stessi valori predefiniti di arrotondamento si applicano qui, quindi se vogliamo restituire un valore troncato possiamo impostare la modalità di arrotondamento su FLOOR :

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

6. Utilizzo di BigDecimal.toString ()

L'ultimo approccio vedremo è BigDecimal , che includeremo perché fuori-effettua NumberFormat e DecimalFormat per grandi doppi s .

Possiamo usare BigDecimal 's setScale metodo per dire se vogliamo arrotondare o troncare:

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

Ricorda che i BigDecimal sono immutabili quindi, come le stringhe, dobbiamo reimpostare il valore.

E, poi, chiamiamo semplicemente BigDecimal 's toString :

String rounded = big.toString();

7. Conclusione

In questo tutorial, abbiamo esaminato i diversi modi in cui possiamo convertire un double in una stringa rimuovendo le posizioni decimali. Abbiamo fornito approcci che restituiscono valori arrotondati o troncati.

Come al solito, i campioni e i benchmark sono disponibili su GitHub.