Parse: примеры (JAVA)
parse(CharSequence text): LocalDateОбщее описание parse-методов в Java
В Java под словом "parse" чаще всего подразумеваются статические методы, преобразующие текстовые представления в примитивные типы или объекты. Наиболее распространённые варианты: Integer.parseInt, Long.parseLong, Double.parseDouble, Float.parseFloat, Boolean.parseBoolean, а также методы парсинга дат в пакете java.time (например, LocalDate.parse).
Типичные шаблоны подписей и поведение:
int Integer.parseInt(String s)- принимает строку в десятичной системе, возвращает int или выбрасываетNumberFormatException.int Integer.parseInt(String s, int radix)- принимает основание системы счисления (2..36). Возвращает int илиNumberFormatException.long Long.parseLong(String s)иlong Long.parseLong(String s, int radix)- аналогично для long.double Double.parseDouble(String s)иfloat Float.parseFloat(String s)- парсинг чисел с плавающей точкой, принимаются строки вроде "123.45", "1.2e3", "NaN", "Infinity".boolean Boolean.parseBoolean(String s)- возвращаетtrueтолько если строка равна (без учёта регистра) "true", в противном случаеfalse. Исключений не бросает при неверном формате.byte Byte.parseByte(String s),short Short.parseShort(String s)- ограничения по диапазону соответствуют типу.BigDecimal new BigDecimal(String s)илиnew BigInteger(String s)- точный парсинг больших чисел и десятичных значений без потерь значимости.LocalDate.parse(CharSequence text),LocalDateTime.parse(CharSequence text, DateTimeFormatter f)и другие - парсинг дат/времён с возможностью передачи формата черезDateTimeFormatter. При несоответствии формата выбрасываетсяDateTimeParseException.
Общие характеристики аргументов и возвращаемых значений:
- Аргумент обычно строка (
String) илиCharSequence. Для части методов допускается указание дополнительного параметра, например,radixдля целочисленных парсеров илиDateTimeFormatterдля дат. - Возвращается соответствующий примитивный тип или объект (например,
int,long,double,BigDecimal,LocalDate). - При некорректном формате обычно выбрасывается проверяемое или непроверяемое исключение:
NumberFormatException,DateTimeParseException, иногдаNullPointerExceptionесли аргумент null.
Рекомендации по использованию
- Для целых чисел использовать
parseXxxилиvalueOfв зависимости от требуемого результата (примитив или объект). - Для точных десятичных вычислений предпочесть
BigDecimalвместоdouble. - Для дат и времени использовать API
java.timeс явно заданными форматерами, чтобы избежать проблем с локалью и неоднозначными форматами.
Примеры базового использования
Короткие демонстрации основных вариантов парсинга. В блоках кода показан ввод и ожидаемый результат.
// Integer.parseInt
int a = Integer.parseInt("123");
System.out.println(a);
123
// Integer.parseInt с основанием
int b = Integer.parseInt("ff", 16);
System.out.println(b);
255
// Double.parseDouble
double d = Double.parseDouble("3.14e1");
System.out.println(d);
31.4
// Boolean.parseBoolean
boolean f1 = Boolean.parseBoolean("true");
boolean f2 = Boolean.parseBoolean("yes");
System.out.println(f1 + ", " + f2);
true, false
// LocalDate.parse с форматтером
java.time.format.DateTimeFormatter fmt = java.time.format.DateTimeFormatter.ofPattern("dd.MM.yyyy");
java.time.LocalDate date = java.time.LocalDate.parse("21.04.2021", fmt);
System.out.println(date);
2021-04-21
// BigDecimal для точного десятичного парсинга
java.math.BigDecimal bd = new java.math.BigDecimal("0.1");
System.out.println(bd.add(bd));
0.2
Похожие способы парсинга в Java
Короткая сводка альтернативных подходов в Java:
- Integer.valueOf(String) - возвращает объект
Integer. Полезно при работе с коллекциями или если требуется null-контроль через обёртки. - Scanner - позволяет считать и распарсить токены из потока с учётом локали. Подходит для интерактивного ввода или чтения файлов построчно.
- NumberFormat / DecimalFormat - локаль-чувствительный парсинг чисел и форматирование, полезен для пользовательских интерфейсов.
- Pattern и Matcher - предварительная валидация или извлечение частей строки перед парсингом.
- ObjectMapper (Jackson) / Gson - для парсинга JSON-структур в объекты Java, включая численные поля с конвертацией.
Выбор зависит от требований: для простого и быстрого парсинга строк в примитивы - методы parseXxx; для локализации и форматирования - NumberFormat; для сложных текстовых протоколов - регулярные выражения или парсеры.
Эквиваленты в других языках и отличия
Краткие примеры по языкам с особенностями по сравнению с Java.
- JavaScript
// parseInt и parseFloat в JS console.log(parseInt('10')); // 10 console.log(parseInt('0xff', 16)); // 255 console.log(parseFloat('3.14e1')); // 31.410 255 31.4
Отличие:
parseIntможет игнорировать хвостовые символы,Number()деликатнее. - Python
# int, float, bool в Python print(int('123')) print(int('ff', 16)) print(float('3.14e1')) print(bool('False'))123 255 31.4 True
Особенность:
bool('False')возвращает True, так как непустая строка рассматривается как истина; для надёжности требуется явная проверка. - PHP
// intval, floatval var_dump(intval('123')); var_dump(intval('0xff'));int(123) int(0)
Особенность: строка '0xff' не распознаётся как шестнадцатеричная без указания параметра base.
- C#
// int.Parse и int.TryParse Console.WriteLine(int.Parse("123")); int v; Console.WriteLine(int.TryParse("abc", out v));123 False
Отличие: методы TryParse возвращают булево и не выбрасывают исключение при ошибке.
- Go
// strconv v, err := strconv.ParseInt("123", 10, 64) fmt.Println(v, err)123 <nil>
Отличие: возвращается кортеж (значение, ошибка) вместо исключения.
- Kotlin
// toInt и toIntOrNull println("123".toInt()) println("abc".toIntOrNull())123 null
Отличие: в стандартной библиотеке Kotlin есть удобные функции, возвращающие null при неудаче.
- Lua
-- tonumber print(tonumber('123')) print(tonumber('0xff'))123 nil
Особенность: шестнадцатеричная строка не распознаётся по умолчанию.
- SQL
-- CAST и CONVERT SELECT CAST('123' AS INT) AS v;v 123
Отличие: поведение при ошибке зависит от СУБД и может возвращать ошибку или NULL.
Типичные ошибки и примеры
Ниже несколько распространённых ситуаций с демонстрацией кода и результата.
// NumberFormatException при неверном формате
int x = Integer.parseInt("12ab");
System.out.println(x);
Exception in thread "main" java.lang.NumberFormatException: For input string: "12ab"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
...
// Переполнение диапазона
int y = Integer.parseInt("2147483648");
System.out.println(y);
Exception in thread "main" java.lang.NumberFormatException: For input string: "2147483648"
at ...
// NullPointerException при null-аргументе
String s = null;
int z = Integer.parseInt(s);
Exception in thread "main" java.lang.NumberFormatException: null
at java.base/java.lang.Integer.parseInt(Integer.java:614)
...
// DateTimeParseException при несоответствии формата
java.time.LocalDate.parse("2021/04/21");
Exception in thread "main" java.time.format.DateTimeParseException: Text '2021/04/21' could not be parsed at index 4
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
...
Другие распространённые проблемы: неверная локаль при парсинге чисел с разделителями, ожидание точности double вместо BigDecimal, неверный radix для целых чисел, игнорирование хвостовых символов в некоторых языках (не в Java).
Изменения в парсинге в современных версиях Java
- В Java 8 добавлен новый API для даты и времени
java.time, который включает удобные методыparseи гибкиеDateTimeFormatter. Это заменило устаревшийjava.util.DateиSimpleDateFormatв большинстве задач. - В Java 8 появились методы для беззнакового парсинга, такие как
Integer.parseUnsignedIntиLong.parseUnsignedLong, позволяющие работать с беззнаковыми значениями в строковом виде. - Небольшие улучшения в обработке специальных значений для
FloatиDouble(поддержка "NaN" и "Infinity" остаётся). Общая семантикаparseXxxстабильна и сохраняет обратную совместимость.
Расширенные и редкие сценарии парсинга
Несколько подробных примеров с объяснениями.
// Парсинг с учётом основания и знака
String s = "-FF";
int v = Integer.parseInt(s.substring(0,1).equals("-") ? s.substring(1) : s, 16);
if (s.startsWith("-")) v = -v;
System.out.println(v);
-255
Пояснение: Integer.parseInt не принимает знак в сочетании с radix в простом варианте, поэтому извлечение знака и последующий инверс необходимы в ручном коде.
// Безопасный парсинг: шаблон TryParse-подобный
static Integer tryParseInt(String s, int radix) {
try { return Integer.parseInt(s, radix); } catch (NumberFormatException e) { return null; }
}
System.out.println(tryParseInt("123", 10));
System.out.println(tryParseInt("abc", 10));
123 null
Пояснение: аналог TryParse из других языков, возвращающий null при ошибке.
// Локаль-ориентированный парсинг через NumberFormat
java.text.NumberFormat nf = java.text.NumberFormat.getInstance(java.util.Locale.GERMANY);
Number n = nf.parse("1.234,56");
System.out.println(n.doubleValue());
1234.56
Пояснение: в Германии разделитель тысяч "." а десятичный ",". Простые parseDouble не учитывают локаль.
// Парсинг чисел большой точности через BigDecimal
java.math.BigDecimal a = new java.math.BigDecimal("0.30000000000000004");
java.math.BigDecimal b = new java.math.BigDecimal("0.1");
System.out.println(a.subtract(b));
0.20000000000000004
Пояснение: BigDecimal получает точное десятичное представление из строки, избегая ошибок двоичного представления.
// Парсинг перечислений с нечувствительностью к регистру
enum Color { RED, GREEN, BLUE }
Color c = Color.valueOf("red".toUpperCase());
System.out.println(c);
RED
Пояснение: для удобства можно приводить строку к верхнему регистру перед вызовом valueOf.
// Разбор сложной строки: извлечение чисел регулярным выражением
String line = "id=42; price=19.95 USD";
java.util.regex.Matcher m = java.util.regex.Pattern.compile("price=(\\d+\\.\\d+)").matcher(line);
if (m.find()) {
double price = Double.parseDouble(m.group(1));
System.out.println(price);
}
19.95
Пояснение: регулярные выражения помогают выделить правильную подстроку для дальнейшего парсинга.
// Парсинг JSON-числа в BigDecimal с Jackson
com.fasterxml.jackson.databind.ObjectMapper om = new com.fasterxml.jackson.databind.ObjectMapper();
om.configure(com.fasterxml.jackson.core.JsonParser.Feature.USE_BIG_DECIMAL_FOR_FLOATS, true);
java.math.BigDecimal bd = om.readTree("{\"price\": 0.1}").get("price").decimalValue();
System.out.println(bd);
0.1
Пояснение: конфигурация парсера позволяет получать точные BigDecimal вместо double при чтении JSON.