Как лучше переводить число в строку?
Какой способ будет правильнее использовать один из методов или можно писать «»+number , и принципиально ли это вообще в этом случае?
Отслеживать
Amir Shabanov
задан 16 окт 2016 в 17:19
Amir Shabanov Amir Shabanov
653 4 4 серебряных знака 21 21 бронзовый знак
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Методы String.valueOf и Integer.toString(int number) одинаковы по эффективности, т.к. первый метод внутри себя вызывает второй.
По поводу number+»» и Integer.toString(int number) несколько сложнее. Создание строки через +»» , как правило, разворачивается компилятором в StringBuilder , с дальнейшим вызовом метода append . Согласно моему тесту производительности, метод Integer.toString немного быстрее, процентов на 10-20.
Что происходит внутри метода Integer.toString ?
Если взглянуть на его реализацию, увидем, что там аллоцируется массив char, который заполняется числами, при помощи битовых сдвигов. В методе StringBuilder.append(int number) происходят аналогичные действия. Но, как мне кажется, за счет создания объекта StringBuilder этот способ оказывается медленнее.
Взаимное преобразование чисел и символьных строк Java
Одной из наиболее часто выполняемых рутинных операций в программировании является преобразование строкового представления чисел во внутренний двоичный формат.
Правда, сделать это в Java совсем не трудно. В классах Byte, Short, Integer и Long для этой цели предоставляются методы parseByte(), parseShort(), parseInt() и parseLong() соответственно.
Эти методы возвращают значения типа byte, short, int или long, эквивалентные числовой строке, с которой они были вызваны (аналогичные методы предусмотрены в классах Float и Double).
В приведенном ниже примере программы демонстрируется применение метода parseInt(). В этой программе суммируется ряд целочисленных значений, вводимых пользователем.
С этой целью целочисленные значения считываются методом readLine() в виде числовых строк, которые затем преобразуются методом parseInt() в эквивалентные им числовые значения типа int.
Преобразование строки в BigDecimal в Java
В этом руководстве мы рассмотрим множество способов преобразования 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 .
- 1. Обзор
- 2. Большой десятичный
- 3. Большой десятичный (строка)
- 4. BigDecimal.valueOf()
- 5. ДесятичныйФормат.parse()
- 6. Недействительные преобразования
- 7. Заключение
Как перевести число в строку в java
Нередко может возникнуть необходимость объединить строку с данными других типов, например, числами. Однако объединить строку мы можем только с другой строкой. Поэтому данные других типов вначале необходимо преобразовать в строку. Для преобразования в строку применяется функция std:to_string() , в которую передается преобразуемое значение:
#include #include int main() < unsigned age; std::string message< "Age: " + std::to_string(age)>; std::cout
Функции преобразования из строки в число
Нередко может вощникнуть противиположная задача — преобразовать строку в другой тип. Есть ряд функций, которые преобразуют строку в число определенного типа:
- stoi() : преобразует в тип int
- stol() : в long
- stoll() : в long long
- stoul() : в unsigned long
- stoull() : в unsigned long long
- stof() : в float
- stod() : в double
- stold() : в long double
Все они определены в модуле , работают однотипно и в качестве параметра принимают преобразуемую строку:
std::string str< "123" >; int n< std::stoi(str) >; // n == 123
Преобразование строки в указатель на символы
При необходимости можно преобразовать значение типа string в указатель на символы. Для преобразования в указатель на константную строку применяется метод c_str() :
#include #include int main() < std::string message ; const char* message_ptr = message.c_str(); // преобразуем в указатель std::cout
Для получения указателя также можно применять метод data() , который возвращает указатель на неконстантное значение, если объект string не является константой.
#include #include int main() < std::string message ; char* message_ptr = message.data(); // преобразуем в указатель std::cout
