Avatar ·

Как проверить, является ли строка числом в Java?

Всем привет! Я начинающий Java-разработчик и столкнулся с такой проблемой: мне нужно проверить, содержит ли строка только цифры или может быть преобразована в число. Например, у меня есть пользовательский ввод, и я хочу убедиться, что это действительно число, прежде чем выполнять с ним математические операции. Вот что я пробовал:
String input = "123";
if (input.matches("\\d+")) {
    int number = Integer.parseInt(input);
    System.out.println("Это число: " + number);
}
Но это работает только для целых положительных чисел. А что делать с отрицательными числами, числами с плавающей точкой (например, "3.14") или числами в научной нотации (например, "1.5e10")? Я также заметил, что метод `Integer.parseInt()` выбрасывает `NumberFormatException`, если строка не является корректным целым числом. Как правильно обрабатывать все эти случаи? Мне нужно надежное решение, которое будет работать для: - Целых чисел (положительных и отрицательных) - Чисел с плавающей точкой - Чисел в научной нотации - Пустых строк и null Заранее спасибо за помощь! <<>>

Проверка строки на числовое значение в Java: полное руководство

Проблема проверки строки на числовое значение — одна из самых распространенных в Java. Рассмотрим несколько надежных подходов, начиная с самого простого и заканчивая универсальным решением.

1. Использование try-catch с парсингом (простой способ)

Самый прямолинейный метод — попробовать преобразовать строку в число и поймать исключение:

public static boolean isNumeric(String str) {
    if (str == null) {
        return false;
    }
    try {
        Double.parseDouble(str);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}

Этот метод работает для:

  • Целых чисел: "123", "-456"
  • Чисел с плавающей точкой: "3.14", "-0.001"
  • Научной нотации: "1.5e10", "2.5E-3"
  • Специальных значений: "NaN", "Infinity" (если нужно их исключить, добавьте дополнительную проверку)

Важно: Метод Double.parseDouble() принимает строки "NaN" и "Infinity" как валидные числа. Если вам нужно их отсеять, модифицируйте код:

public static boolean isNumeric(String str) {
    if (str == null) {
        return false;
    }
    try {
        double d = Double.parseDouble(str);
        // Исключаем NaN и Infinity
        return !Double.isNaN(d) && !Double.isInfinite(d);
    } catch (NumberFormatException e) {
        return false;
    }
}

2. Использование Apache Commons Lang

Библиотека Apache Commons Lang предоставляет готовый утилитарный класс StringUtils:

import org.apache.commons.lang3.StringUtils;

public static boolean isNumeric(String str) {
    return StringUtils.isNumeric(str);
}

Особенности: Этот метод работает только для целых неотрицательных чисел. Он не поддерживает отрицательные числа, десятичные разделители или научную нотацию. Для более сложных случаев используйте NumberUtils.isCreatable():

import org.apache.commons.lang3.math.NumberUtils;

public static boolean isNumeric(String str) {
    return NumberUtils.isCreatable(str);
}

Метод isCreatable() поддерживает:

  • Целые числа (включая отрицательные)
  • Числа с плавающей точкой
  • Шестнадцатеричные числа (начинающиеся с 0x)
  • Научную нотацию
  • Корректно обрабатывает null и пустые строки

3. Использование регулярных выражений (для строгого контроля)

Если вам нужен полный контроль над форматом числа, используйте регулярные выражения:

public static boolean isNumeric(String str) {
    if (str == null || str.isEmpty()) {
        return false;
    }
    // Регулярное выражение для чисел с плавающей точкой
    String regex = "-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?";
    return str.matches(regex);
}

Разбор регулярного выражения:

  • -? — необязательный знак минуса
  • \\d+ — одна или более цифр
  • (\\.\\d+)? — необязательная дробная часть
  • ([eE][+-]?\\d+)? — необязательная экспоненциальная часть

Рекомендации

Для большинства случаев используйте подход с Double.parseDouble() и обработкой исключений — это самый надежный и производительный метод. Если вы используете Apache Commons Lang, предпочтите NumberUtils.isCreatable(). Регулярные выражения применяйте только когда нужен специфический формат чисел.

<<>>

Альтернативный подход: проверка с помощью NumberFormat

В Java также можно использовать класс NumberFormat для проверки, является ли строка числом. Этот подход особенно полезен, если вы работаете с локализованными форматами чисел (например, с запятой как десятичным разделителем):

import java.text.NumberFormat;
import java.text.ParsePosition;

public static boolean isNumeric(String str) {
    if (str == null || str.isEmpty()) {
        return false;
    }
    NumberFormat formatter = NumberFormat.getInstance();
    ParsePosition pos = new ParsePosition(0);
    formatter.parse(str, pos);
    // Проверяем, что строка полностью разобрана
    return pos.getIndex() == str.length();
}

Этот метод корректно обрабатывает:

  • Целые числа
  • Числа с плавающей точкой
  • Числа с группировкой разрядов (например, "1,234.56" для локали США)
  • Отрицательные числа

Недостатки: Метод не поддерживает научную нотацию и может давать ложные срабатывания на строках, содержащих пробелы в начале или конце. Для простых случаев лучше использовать первый подход с Double.parseDouble().