Converter Double em String, removendo casas decimais

Converter Double em String, removendo casas decimais

1. Introdução

Neste tutorial, vamos dar uma olhada nodifferent ways to convert a double value to a String, removing its decimal places.

Veremos como fazer isso quando queremos apenas truncar a parte decimal e quando queremos arredondá-la.

2. Truncamento usando fundição

Se nosso valordouble estiver dentro do intervaloint, podemoscast it to an intO elenco trunca a parte decimal, o que significa que a corta sem fazer nenhum arredondamento.

Essa abordagem é cerca de 10 vezes mais rápida que as outras abordagens que veremos.

Uma vez que é umint,then we can then pass it to the valueOf methodon the String class:

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

Podemos usar essa abordagem com segurança quando temos a garantia de quethe double value is within the range of an int. Masif our value exceeds that, casting won’t work like we’d want.

3. Arredondamento usandoString.format()

Agora, as abordagens restantes não são tão limitadas quanto o casting, mas têm suas próprias nuances.

Por exemplo, outra abordagem é usar o métodoformat da classeString. O primeiro parâmetro do método especifica que estamos formatando um valor de ponto flutuante com zero dígitos após o ponto decimal:

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

The format method uses HALF_UP rounding que será arredondado para cima se o valor após a parte fracionária for 0,5 ou superior. Caso contrário, ele retornará o número antes do ponto decimal.

E, embora simples,String.formatis the slowest way to do this.

4. UsandoNumberFormat.format()

A classeNumberFormat também fornece um métodoformat semelhante à classeString, masNumberFormat is faster and with it, we can specify the rounding mode to achieve either truncation or rounding.

O métodosetMaximumFractionDigits() informa ao formatador quantos dígitos fracionários após o ponto decimal incluir na saída:

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

Curiously, NumberFormat doesn’t use HALF_UP by default. Em vez disso, ele usa o arredondamentoHALF_EVEN por padrão, o que significa que ele será arredondado normalmente, exceto em 0,5,in which case it will pick the nearest even number.

While HALF_EVEN is helpful with statistical analysis, vamos usarHALF_UP para ser consistente:

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

E,we can change this and achieve truncation by setting the formatter to use the FLOOR rounding mode instead:

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

E agora, ele truncará em vez de redondo.

5. UsandoDecimalFormat.format()

Semelhante aNumberFormat, a classeDecimalFormat pode ser usada para formatar valoresdouble. No entanto, em vez de definir o formato de saída com chamadas de método,we can tell the formatter what output we want by providing the constructor with a specific pattern:

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

O padrão “, ##” significa que queremos que o formatador retorne apenas a parte inteira da entrada. Também indica que queremos que os dígitos agrupados em três sejam separados por vírgula.

Os mesmos padrões de arredondamento se aplicam aqui, portanto, se quisermos gerar um valor truncado, podemos definir o modo de arredondamento paraFLOOR:

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

6. UsandoBigDecimal.toString()

A última abordagem que veremos éBigDecimal, que incluiremos porqueit out-performs NumberFormat and DecimalFormat for larger doubles.

Podemos usar o métodoBigDecimal'ssetScale method para dizer se queremos arredondar ou truncar:

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

Lembre-se de queBigDecimals são imutáveis, portanto, como Strings, precisamos redefinir o valor.

E, então, chamamos apenasBigDecimal'stoString:

String rounded = big.toString();

7. Conclusão

Neste tutorial,we looked at the different ways in which we can convert a double to a String while removing decimal places. Fornecemos abordagens que produziriam valores arredondados ou truncados.

Como de costume, as amostras e benchmarks estão disponíveisover on GitHub.