Конвертировать Double в String, удаляя десятичные знаки

Конвертировать Double в String, Удаление десятичных знаков

1. Вступление

В этом руководстве мы рассмотримdifferent ways to convert a double value to a String, removing its decimal places.

Мы посмотрим, как это сделать, когда нужно просто обрезать десятичную часть, а когда нужно округлить ее.

2. Усечение с использованием приведения

Если наше значениеdouble находится в диапазонеint, мы можемcast it to an int Приведение обрезает десятичную часть, что означает, что оно обрезает ее без округления.

Этот подход примерно в 10 раз быстрее, чем другие подходы, которые мы рассмотрим.

Если этоint,then we can then pass it to the valueOf methodon the String class:

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

Мы можем уверенно использовать этот подход, если нам гарантировано, чтоthe double value is within the range of an int. Ноif our value exceeds that, casting won’t work like we’d want.

3. Округление с использованиемString.format()

Теперь остальные подходы не так ограничены, как кастинг, но имеют свои нюансы.

Например, другой подход - использовать методformat классаString. Первый параметр метода указывает, что мы форматируем значение с плавающей запятой с нулевыми цифрами после десятичной точки:

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

The format method uses HALF_UP rounding, который будет округлен в большую сторону, если значение после дробной части составляет 0,5 или больше. В противном случае он возвращает число до десятичной точки.

И пока просто,String.formatis the slowest way to do this.

4. ИспользуяNumberFormat.format()

КлассNumberFormat также предоставляет методformat, аналогичный классуString, ноNumberFormat is faster and with it, we can specify the rounding mode to achieve either truncation or rounding.

МетодsetMaximumFractionDigits() сообщает модулю форматирования, сколько знаков после запятой следует включить в вывод:

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

Curiously, NumberFormat doesn’t use HALF_UP by default. Вместо этого по умолчанию используется округлениеHALF_EVEN, что означает округление как обычно, за исключением .5,in which case it will pick the nearest even number.

While HALF_EVEN is helpful with statistical analysis,, давайте использоватьHALF_UP для согласованности:

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

И,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)

И теперь оно будет обрезаться вместо круглого.

5. ИспользуяDecimalFormat.format()

ПодобноNumberFormat, классDecimalFormat может использоваться для форматирования значенийdouble. Однако вместо установки формата вывода с вызовами методов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);

Шаблон «, ##» означает, что мы хотим, чтобы средство форматирования возвращало только целую часть ввода. Это также означает, что мы хотим, чтобы цифры сгруппировались в тройки, разделенные запятой.

Здесь применяются те же значения округления по умолчанию, поэтому, если мы хотим вывести усеченное значение, мы можем установить режим округления наFLOOR:

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

6. ИспользуяBigDecimal.toString()

Последний подход, который мы рассмотрим, - этоBigDecimal, который мы включим, потому чтоit out-performs NumberFormat and DecimalFormat for larger doubles.

Мы можем использовать методBigDecimal ’ssetScale , чтобы определить, хотим ли мы округлить или усечь:

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

Помните, чтоBigDecimals неизменяемы, поэтому, как и строки, нам нужно сбросить значение.

А затем мы просто вызываемBigDecimal‘stoString:

String rounded = big.toString();

7. Заключение

В этом руководствеwe looked at the different ways in which we can convert a double to a String while removing decimal places. мы предоставили подходы, которые выводят либо округленные, либо усеченные значения.

Как обычно, доступны образцы и тестыover on GitHub.