Как проверить, является ли строка числом в 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().