Самое элегантное решение isNumeric() для java

Я портирую небольшой фрагмент PHP-кода на java прямо сейчас, и я полагался на функцию is_numeric($x) определить, если $x - это число или нет. В java, похоже, нет эквивалентной функции, и я не удовлетворен текущими решениями, которые я нашел до сих пор.

Я склоняюсь к решению регулярного выражения, найденному здесь:http://rosettacode.org/wiki/Determine_if_a_string_is_numeric

какой метод я должен использовать и почему?

7 ответов


обратите внимание, что функция PHP isNumeric () правильно определит, что шестнадцатеричная и научная нотация-это числа, на которые не будет ссылаться подход regex.

один из вариантов, особенно если вы уже используете библиотеки Apache Commons, - использовать NumberUtils.isNumber (), из Коммонс-Ланг. Он будет обрабатывать те же случаи, что и функция PHP.


вы изучили использование библиотека StringUtils? Существует функция isNumeric (), которая может быть тем, что вы ищете. (Заметим, что "" будет оценено как true)


обычно плохая идея иметь число в строке. Если вы хотите использовать это число, проанализируйте его и используйте в качестве числа. Вам не нужно "проверять", если это число, либо вы хотите использовать его как числовое, либо нет.

Если вам нужно преобразовать его, то вы можете использовать каждый парсер из Integer.parseInt(String) до BigDecimal(String)

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

и не использовать parseInt, если ваша строка может содержать float.


дополнительно можно использовать регулярное выражение.

   if (theString.matches("((-|\+)?[0-9]+(\.[0-9]+)?)+")))
     return true;

    return false;

вы пробовали Integer.parseInt()? (Я не уверен в имени метода, но класс Integer имеет метод, который создает объект Integer из строк). Или, если вам нужно обрабатывать нецелые числа, аналогичные методы доступны и для двойных объектов. Если они терпят неудачу, создается исключение.

Если вам нужно проанализировать очень большие числа (больше, чем int/double), и не нужно точное значение, то может быть достаточно простого метода на основе регулярных выражений.


на строго типизированном языке общий isNumeric (String num) метод не очень полезен. 13214384348934918434441 является числовым, но не подходит для большинства типов. Многие из тех, где is подходит, не будут возвращать одно и то же значение.

Как отметил Колин, проведение номеров в строках с приложением не рекомендуется. Функция isNumberic должна применяться только для входных данных о методах интерфейса. Они должны иметь более точное определение, чем статистика. Другие предусмотрены различные решения. Регулярные выражения могут использоваться для проверки сразу нескольких условий, включая длину строки.


просто использовать если ((x instanceof Number)

//если проверка на возможные номером

|| (X instanceof String & & x.спички("((-|\+)?[0-9]+(\.[0-9]+)?)+"))

){ ... }
//- - - Все числовые типы, включая BigDecimal extend Number