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 .