Parse: примеры (JAVA)

Практическое руководство по парсингу строк в Java
Раздел: Время и дата (Date & Time API)
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.4
    10
    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 стабильна и сохраняет обратную совместимость.

Расширенные и редкие сценарии парсинга

Несколько подробных примеров с объяснениями.

Пример java
// Парсинг с учётом основания и знака
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 в простом варианте, поэтому извлечение знака и последующий инверс необходимы в ручном коде.

Пример java
// Безопасный парсинг: шаблон 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 при ошибке.

Пример java
// Локаль-ориентированный парсинг через 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 не учитывают локаль.

Пример java
// Парсинг чисел большой точности через 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 получает точное десятичное представление из строки, избегая ошибок двоичного представления.

Пример java
// Парсинг перечислений с нечувствительностью к регистру
enum Color { RED, GREEN, BLUE }
Color c = Color.valueOf("red".toUpperCase());
System.out.println(c);
RED

Пояснение: для удобства можно приводить строку к верхнему регистру перед вызовом valueOf.

Пример java
// Разбор сложной строки: извлечение чисел регулярным выражением
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

Пояснение: регулярные выражения помогают выделить правильную подстроку для дальнейшего парсинга.

Пример java
// Парсинг 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.

джава parse function comments

En
Parse Obtains an instance of LocalDate from a text string