Перейти к содержимому

Как проверить что строка это число java

  • автор:

Как проверить строку на цифры java

Для того, чтобы проверить строку на цифры, можно воспользоваться методами класса StringUtils из библиотеки Apache Commons Lang . Этот класс содержит множество полезных методов, которые упрощают работу со строками. Для начала нужно установить в проект новую зависимость. Если вы используете gradle, нужно добавить в файл build.gradle в секцию dependencies такой код:

implementation 'org.apache.commons:commons-lang3:3.12.0' 

Затем класс нужно импортировать в том месте, где вы планируете его использовать:

import org.apache.commons.lang3.StringUtils; 

Для проверки строки на цифры, в классе есть статический метод isNumeric() . В качестве аргумента метод принимает последовательность символов CharSequence и возвращает булево значение в зависимости от того, состоит ли строка только из цифр.

StringUtils.isNumeric("hello"); // false StringUtils.isNumeric("hello12"); // false StringUtils.isNumeric("123"); // true 

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

Также можно воспользоваться методом StringUtils.isNumeric() :

import org.apache.commons.lang3.StringUtils; public class App  public static void main(String[] args)  System.out.println(StringUtils.isNumeric("123")); // => true System.out.println(StringUtils.isNumeric("12a3")); // => false > > 

09 января 2023

Другой пример реализации метода с помощью регулярных выражений :

public static boolean isNumber(String str)  return str.matches("-?\\d+"); > 

09 января 2023

Приведенный ниже метод isNumber() проверит является ли строка числом :

public class App  public static void main(String[] args)  System.out.println(isNumber("123")); // => true System.out.println(isNumber("12q3")); // => false > public static boolean isNumber(String str)  try  Integer.parseInt(str); > catch (Exception e)  return false; > return true; > > 

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

У меня тоже работает. Я просто про объявление throws NumberFormatException — по-моему оно лишнее, т.к. это исключение из функции никогда не вылетит.

2 дек 2011 в 22:39

Еще можно строку подвергнуть trim(), чтобы отсечь пробелы в начале и в конце (если это, конечно, не принципиально). По поводу имени функции — согласен с @Kremchik

2 дек 2011 в 23:03

Тут главный выбор из предложенных вариантов — выбор по скорости работы. Сделайте тестовую программку, прогоните эту функцию в разных вариантах много-много раз и проанализируйте время выполнения программы.

2 дек 2011 в 23:08

9 ответов 9

Сортировка: Сброс на вариант по умолчанию

Я так понимаю, цель именно на Integer проверить? Тогда можно:

s.matches("[-+]?\\d+") // для списка из 1 млн целых чисел и не чисел // (примерно 50/50) эффективность этой строчки практически // не отличается от описанной в вопросе функции. 

Если double , но без экспоненциальной нотации, то

((-|\\+)?[0-9]+(\\.[0-9]+)?)+ 

такое регулярное подойдёт.

Хотя я бы не парился и сделал бы точно так же, только с Double.parseDouble(s) , но я не показатель 🙂 И ещё я обратил внимание на название метода — оно не очень корректное, т.к. во-первых, такой есть в классе Character , во-вторых, по смыслу подходит isNumeric() . Но это просто комментарии из серии «что я думаю по этому поводу».

Отслеживать
ответ дан 2 дек 2011 в 22:58
2,828 14 14 серебряных знаков 18 18 бронзовых знаков
8 апр 2016 в 14:23
Проверка выражения является ли 2-1+1 числом, даёт положительный ответ.
24 сен 2019 в 6:06
Это же логично. Разве нет?
24 сен 2019 в 9:47
Спасибо, мне помогло!
14 мая 2021 в 11:12

Есть очень хороший static-метод в commons-lang (класс NumberUtils ), который учитывает множество особенностей чисел Java:

/** * 

Checks whether the String a valid Java number.

* *

Valid numbers include hexadecimal marked with the 0x * qualifier, scientific notation and numbers marked with a type * qualifier (e.g. 123L).

* *

Null and empty String will return * false.

* * @param str the String to check * @return true if the string is a correctly formatted number */ public static boolean isNumber(String str)

Отслеживать
ответ дан 8 апр 2016 в 13:41
Evgeny Lazarev Evgeny Lazarev
1,120 1 1 золотой знак 8 8 серебряных знаков 14 14 бронзовых знаков

Метод, описанный в вопросе, и есть самый правильный метод.

Методы, которые проверяют, состоит ли строка лишь из цифр, не справятся с переполнением (попробуйте число 100000000000000000000000000000000 ). Правильный паттерн для целого числа такой:

 ^(-?([1-9][0-9] |1[0-9] |20[0-9] |21[0-3][0-9] |214[0-6][0-9] |2147[0-3][0-9] |21474[0-7][0-9] |214748[0-2][0-9] |2147483[0-5][0-9] |21474836[0-3][0-9] |214748364[0-7] ) |-2147483648 |0)$ 

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

При этом решения, основанные на паттернах, не будут учитывать локаль и разрешённые разделители разрядов. Так что попробовать распарсить и поймать исключение — практически единственно правильное решение.

Отслеживать
ответ дан 8 апр 2016 в 15:02
207k 28 28 золотых знаков 293 293 серебряных знака 526 526 бронзовых знаков
8 апр 2016 в 15:26

@Qwertiy: Ну, мало ли какие баги и где. Писать кривые велосипеды к багам отдельной версии отдельной платформы — неправильно.

8 апр 2016 в 15:27
Использовать исключения для стандартной логики — неправильно 🙂
8 апр 2016 в 15:33

@Qwertiy: Да, именно для этого и нужен этот метод — заврапить дыру в дизайне платформы. В .NET, например, есть честный int.TryParse .

8 апр 2016 в 15:34

@Qwertiy: Но создавать по сути два отдельных парсера int ‘а и молиться Гослингу, чтобы они оказались консистентными — очень неправильно. Логика разбора int из строки должна быть лишь в одном месте, и это место — Integer.parseInt .

8 апр 2016 в 15:36

В связи с повышенным интересом по данному вопросу, сделал маленькое исследование 🙂

В исследовании принимали участия классы:

CharacterDelegator() // код @Sergey ComplexMatcher() // код @VladD NumberUtilsDelegator() // мой код SimpleMatcher() // код @ivkremer (для простых чисел) GuavaDelegator() // код @Nofate♦ SimpleMatcherWithDot() // код @ivkremer (для чисел с точкой) SimpleParser() // оригинальный код от @pol GuavaComplexDelegator() // модифицированный вариант кода @Nofate♦ для Float InnerSetImpl() // мой специфический вариант 

(@VladD, извиняюсь, понимаю, что делает ваш регэксп, но завести его у меня не получилось)

Вывода много, поэтому вкратце:

  • абсолютно все строки из примера распарсил только NumberUtils (commons-lang)
  • вариант с использованием Guava (расширенный) справился со всем кроме long-нотаций («l») и «0xCAFEBABE» 🙂 (честно, не понимаю, почему он варианты с «f»-нотацией прожевал)
  • остальные варианты в большей степени рассчитаны на парсинг именно интов, хотя в изначальном вопросе об этом ни слова 🙂

А вот самое интересное — это время работы данного кода.

Start performance test for core.impl.CharacterDelegator Ints: 125ms Numbers: 67ms Numbers with 25% errors: 50ms Small Ints: 43ms

Start performance test for core.impl.ComplexMatcher Ints: 10825ms Numbers: 11134ms Numbers with 25% errors: 10606ms Small Ints: 10380ms

Start performance test for core.impl.InnerSetImpl Ints: 50ms Numbers: 52ms Numbers with 25% errors: 54ms Small Ints: 42ms

Start performance test for core.impl.NumberUtilsDelegator Ints: 111ms Numbers: 91ms Numbers with 25% errors: 99ms Small Ints: 51ms

Start performance test for core.impl.SimpleMatcher Ints: 1072ms Numbers: 853ms Numbers with 25% errors: 847ms Small Ints: 766ms

Start performance test for core.impl.GuavaDelegator Ints: 131ms Numbers: 108ms Numbers with 25% errors: 124ms Small Ints: 119ms

Start performance test for core.impl.SimpleMatcherWithDot Ints: 3069ms Numbers: 5855ms Numbers with 25% errors: 5484ms Small Ints: 2548ms

Start performance test for core.impl.SimpleParser Ints: 157ms Numbers: 2189ms Numbers with 25% errors: 2117ms Small Ints: 81ms

Start performance test for core.impl.GuavaComplexDelegator Ints: 980ms Numbers: 943ms Numbers with 25% errors: 1016ms Small Ints: 837ms

Тест построен следующим образом

    Генерируем 2 рандомных списка со стрингами (числа). Тут есть 4 варианта:

 1. Просто Инты. 2. Числа (с 50% вероятностью в стринге есть точка). 3. Числа с возможной ошибкой (25% что в строке есть подстрока "error"). 4. Набор Интов в небольшом диапазоне. 

Из приведенных выкладок видно, что NumberUtils работает быстрее всего. Схожее время работы у простого варианты Guava`ы и простых regexp. Даже добавление простой точки значительно замедляет код. Также замечу, что код @Sergey работает очень быстро, но он рассчитан на проверку строго интов.

А еще есть мой специфический пример InnerSetImpl . Он основан на допущении, что у нас есть ограниченное число возможных вариантов (то есть, мы можем и готовы держать их в памяти). Тогда мы просто помещаем их в HashSet и проверяем наличие строк в нем. Собственно, такой вариант самый быстрый, но допущение многое портит 🙂

ИТОГО: если нужно простое и элегантное решение — то лучше всего воспользоваться NumberUtils.isNumber(str) и не париться.

А если вдруг у вас стоит специфическая задача на парсинг не просто чисел, но чисел в Java-нотациях, то это единственный полностью рабочий вариант.

(Все вышесказанное относится только к приведенному коду. Я не исключаю, что можно придумать (или даже существует) более правильное или более быстрое решение).

Является ли строка числом

В данной статье мы узнаем, как осуществить проверку на то, является ли заданная строка числом. Мы рассмотрим несколько способов: с использованием внешних библиотек и с помощью стандартного API JavaSE.

Способ 1: проверка, является ли строка числом (Java API)

Здесь мы используем только стандартный API JavaSE. В первом варианте мы пытаемся привести строку к типу Double, и если у нас это получается, мы считаем, что указанная строка – число:

public static boolean isNumeric(String str) < try < Double.parseDouble(str); return true; >catch (NumberFormatException e) < return false; >>

С помощью этого метода вы можете проверить целые числа, дробные числа, числа с ведущим знаком плюса или минуса.

Способ 2: проверка, является ли строка числом (Apache Commons)

В этом способе мы используем библиотеку Apache Commons. Если у вас Maven проект, укажите следующий артефакт в вашем файле pom.xml:

 org.apache.commons commons-lang3 3.9 

С помощью метода NumberUtils.isParsable мы можем проверить, является ли указанная строка числом:

System.out.println(NumberUtils.isParsable("120.99")); // true System.out.println(NumberUtils.isParsable("+120.99f")); // true System.out.println(NumberUtils.isParsable("-120.99f")); // true System.out.println(NumberUtils.isParsable("120.99abc")); // false System.out.println(NumberUtils.isParsable("0xFF")); // false

Метод isParsable является обёрткой поверх Integer.parseInt, Long.parseLong, Float.parseFloat и Double.parseDouble. Его удобно использовать для того, чтобы самому не писать шаблонный код по перехвату исключений этих методов.

public class IsStringNumber1 < public static void main(String[] args) < System.out.println(isNumeric("120.99")); // true System.out.println(isNumeric("+120.99f")); // true System.out.println(isNumeric("-120.99")); // true System.out.println(isNumeric("120.99abc")); // false System.out.println(isNumeric("0xFF")); // false >public static boolean isNumeric(String str) < try < Double.parseDouble(str); return true; >catch (NumberFormatException e) < return false; >> >
import org.apache.commons.lang3.math.NumberUtils; public class IsStringNumber2 < public static void main(String[] args) < System.out.println(NumberUtils.isParsable("120.99")); // true System.out.println(NumberUtils.isParsable("+120.99f")); // true System.out.println(NumberUtils.isParsable("-120.99f")); // true System.out.println(NumberUtils.isParsable("120.99abc")); // false System.out.println(NumberUtils.isParsable("0xFF")); // false >>

Заключение

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

Является ли строка числом

  • ← Проверка версии Java
  • Вывод в консоль →

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *