Наиболее элегантное решение isNumeric () для Java - PullRequest
16 голосов
/ 18 августа 2010

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

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

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

Ответы [ 7 ]

16 голосов
/ 18 августа 2010

Обратите внимание, что функция PHP isNumeric () будет правильно определять, что шестнадцатеричное и научное обозначение являются числами, а подход регулярных выражений, на который вы ссылаетесь, не будет.

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

4 голосов
/ 18 августа 2010

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

2 голосов
/ 18 августа 2010

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

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

    return false;
2 голосов
/ 18 августа 2010

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

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

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

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

1 голос
/ 18 августа 2010

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

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

0 голосов
/ 23 ноября 2013

Просто используйте if ((x instanceof Number)

// если проверяется также на анализируемое число

|| (x instanceof String && x.matches ("((- -| \ +)? [0-9] + (\. [0-9] +)?) + "))

) {...}
// --- Все числовые типывключая номер BigDecimal

0 голосов
/ 18 августа 2010

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

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

...