Перейти к основному содержимому

Преобразование строки в BigDecimal в Java

· 3 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим множество способов преобразования String в BigDecimal в Java.

2. Большой десятичный

BigDecimal представляет неизменяемое десятичное число произвольной точности со знаком . Он состоит из двух частей:

  • Немасштабированное значение - произвольное целое число точности
  • Масштаб - 32-битное целое число, представляющее количество цифр справа от десятичной точки.

Например, BigDecimal 3.14 имеет немасштабированное значение 314 и масштаб 2.

Если ноль или положительный, масштаб представляет собой количество цифр справа от десятичной точки.

Если отрицательное, немасштабированное значение числа умножается на десять в степени отрицания масштаба. Следовательно, значение числа, представленного BigDecimal , равно (Unscaled value × 10 ^-Scale ) .

Класс BigDecimal в Java предоставляет операции для базовой арифметики, манипулирования масштабом, сравнения, преобразования формата и хеширования.

Кроме того, мы используем BigDecimal для высокоточной арифметики, вычислений, требующих контроля над масштабом, и округления . Одним из таких примеров являются расчеты, связанные с финансовыми транзакциями.

Мы можем преобразовать String в BigDecimal в Java, используя один из следующих методов:

  • `Конструктор BigDecimal(String)`
  • `Метод BigDecimal.valueOf()`
  • `Метод DecimalFormat.parse()`

Давайте обсудим каждый из них ниже.

3. Большой десятичный (строка)

Самый простой способ преобразовать String в BigDecimal в Java — использовать конструктор BigDecimal(String) :

BigDecimal bigDecimal = new BigDecimal("123");
assertEquals(new BigDecimal(123), bigDecimal);

4. BigDecimal.valueOf()

Мы также можем преобразовать String в BigDecimal , используя метод BigDecimal.valueOf(double) .

Это двухэтапный процесс. Первым шагом является преобразование String в Double . Второй шаг — преобразовать Double в BigDecimal :

BigDecimal bigDecimal = BigDecimal.valueOf(Double.valueOf("123.42"));
assertEquals(new BigDecimal(123.42).setScale(2, BigDecimal.ROUND_HALF_UP), bigDecimal);

Следует отметить, что некоторые числа с плавающей запятой не могут быть точно представлены с использованием значения Double . Это связано с представлением в памяти чисел с плавающей запятой типа Double . Действительно, число представлено в рациональной форме , максимально приближенной к введенному числу Double . В результате некоторые числа с плавающей запятой становятся неточными .

5. ДесятичныйФормат.parse()

Когда строка , представляющая значение, имеет более сложный формат, мы можем использовать DecimalFormat .

Например, мы можем преобразовать длинное десятичное значение, не удаляя нечисловые символы:

BigDecimal bigDecimal = new BigDecimal(10692467440017.111).setScale(3, BigDecimal.ROUND_HALF_UP);

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(',');
symbols.setDecimalSeparator('.');
String pattern = "#,##0.0#";
DecimalFormat decimalFormat = new DecimalFormat(pattern, symbols);
decimalFormat.setParseBigDecimal(true);

// parse the string value
BigDecimal parsedStringValue = (BigDecimal) decimalFormat.parse("10,692,467,440,017.111");

assertEquals(bigDecimal, parsedStringValue);

Метод DecimalFormat.parse возвращает число , которое мы преобразуем в число BigDecimal с помощью setParseBigDecimal(true).

Обычно DecimalFormat является более продвинутым, чем нам требуется. Таким образом, мы должны отдать предпочтение новому BigDecimal(String) или BigDecimal.valueOf() .

6. Недействительные преобразования

Java предоставляет общие исключения для обработки недопустимых числовых String s.

Примечательно, что new BigDecimal(String), BigDecimal.valueOf() и DecimalFormat.parse генерируют исключение NullPointerException, когда мы передаем null :

@Test(expected = NullPointerException.class)
public void givenNullString_WhenBigDecimalObjectWithStringParameter_ThenNullPointerExceptionIsThrown() {
String bigDecimal = null;
new BigDecimal(bigDecimal);
}

@Test(expected = NullPointerException.class)
public void givenNullString_WhenValueOfDoubleFromString_ThenNullPointerExceptionIsThrown() {
BigDecimal.valueOf(Double.valueOf(null));
}

@Test(expected = NullPointerException.class)
public void givenNullString_WhenDecimalFormatOfString_ThenNullPointerExceptionIsThrown()
throws ParseException {
new DecimalFormat("#").parse(null);
}

Аналогично, новые BigDecimal(String) и BigDecimal.valueOf() вызывают исключение NumberFormatException , когда мы передаем недопустимую строку , которая не может быть проанализирована в BigDecimal (например, & ):

@Test(expected = NumberFormatException.class)
public void givenInalidString_WhenBigDecimalObjectWithStringParameter_ThenNumberFormatExceptionIsThrown() {
new BigDecimal("&");
}

@Test(expected = NumberFormatException.class)
public void givenInalidString_WhenValueOfDoubleFromString_ThenNumberFormatExceptionIsThrown() {
BigDecimal.valueOf(Double.valueOf("&"));
}

Наконец, DecimalFormat.parse выдает ParseException , когда мы передаем недопустимую строку :

@Test(expected = ParseException.class)
public void givenInalidString_WhenDecimalFormatOfString_ThenNumberFormatExceptionIsThrown()
throws ParseException {
new DecimalFormat("#").parse("&");
}

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

В этой статье мы узнали, что Java предоставляет нам несколько методов для преобразования значений String в BigDecimal . Как правило, для этой цели мы рекомендуем использовать новый метод BigDecimal(String) .

Как всегда, код, использованный в этой статье, можно найти на GitHub .