- Проверить, является ли строка числовой в Java
- 2. Предпосылкой
- 3. Использование простой Java
- 3.1. Проверка входов с помощью Scanner
- 4. Использование регулярных выражений
- 5. Использование Apache Commons
- 5.1. NumberUtils.isCreatable (String)
- 5.2. NumberUtils.isParsable (String)
- 5.3. _StringUtils.isNumeric (CharSequence ) ___
- 5.4. StringUtils.isNumericSpace (CharSequence)
- 6. Ориентиры
- 7. Заключение
- Как проверить является ли строка числом java
Проверить, является ли строка числовой в Java
Часто при работе с _Strings нам нужно выяснить, является ли String _ допустимым числом или нет.
- В этом руководстве мы рассмотрим несколько способов определения, является ли данная _Строка _ числовой ** , сначала с использованием простой Java, затем регулярных выражений и, наконец, с использованием внешних библиотек.
После того, как мы закончили обсуждение различных реализаций, мы будем использовать тесты, чтобы понять, какие методы являются оптимальными.
Давайте начнем с некоторых предварительных условий, прежде чем перейти к основному содержанию.
2. Предпосылкой
В последней части этой статьи мы будем использовать внешнюю библиотеку Apache Commons. Чтобы включить эту зависимость, добавьте следующие строки в pom.xml :
org.apache.commons commons-lang3 3.7
3. Использование простой Java
Пожалуй, самый простой и надежный способ проверить, является ли _String _ числовым или нет, — это проанализировать его с помощью встроенных методов Java:
Если эти методы не выдают NumberFormatException , то это означает, что синтаксический анализ был успешным и __String __is числовой:
public static boolean isNumeric(String strNum) < try < double d = Double.parseDouble(strNum); >catch (NumberFormatException | NullPointerException nfe) < return false; >return true; >
Давайте посмотрим на этот метод в действии:
assertThat(isNumeric("22")).isTrue(); assertThat(isNumeric("5.05")).isTrue(); assertThat(isNumeric("-200")).isTrue(); assertThat(isNumeric("10.0d")).isTrue(); assertThat(isNumeric(" 22 ")).isTrue(); assertThat(isNumeric(null)).isFalse(); assertThat(isNumeric("")).isFalse(); assertThat(isNumeric("abc")).isFalse();
В нашем _isNumeric () method мы просто проверяем значения типа Double , но этот метод также можно изменить, чтобы проверять Integer , Float , Long _ и большие числа, используя любой из методов синтаксического анализа, которые мы зачислили ранее ,
Эти методы также обсуждаются в ссылке:/java-string-conversions[Java String Conversions].
3.1. Проверка входов с помощью Scanner
java.util ‘s Scanner class, пожалуй, самый простой способ в простой Java для получения примитивных типов входных данных, таких как int , double и т. д. Он также предоставляет различные API-интерфейсы для проверки, является ли данный вход определенного типа или нет.
Например, следующие API проверяют, имеет ли ввод тип integer, long или float :
Эти API возвращают простые true или false в зависимости от типов ввода. Мы можем использовать эти API, чтобы убедиться, что следующий ввод имеет желаемый тип.
Следующий фрагмент проверяет, является ли ввод целым числом или нет:
try (Scanner scanner = new Scanner(System.in)) < System.out.println("Enter an integer : "); if (scanner.hasNextInt()) < System.out.println("You entered : " + scanner.nextInt()); >else < System.out.println("The input is not an integer"); >>
Точно так же мы можем использовать другие API для проверки других типов.
4. Использование регулярных выражений
Теперь давайте использовать регулярное выражение _-? \ D (\. \ D)? для сопоставления числовых Strings _ , состоящих из положительного или отрицательного целого числа и чисел с плавающей точкой.
Но само собой разумеется, что мы можем определенно изменить это регулярное выражение, чтобы определить и справиться с широким спектром правил. Здесь мы сделаем это просто.
Давайте разберем это регулярное выражение и посмотрим, как оно работает:
« – » Буквально ищет тире, а вопросительный знак « ? » Обозначает его присутствие в качестве дополнительного ** \ d — поиск одной или нескольких цифр
- (\. \ d)? — эта часть регулярного выражения предназначена для определения чисел с плавающей точкой. Вот
мы ищем одну или несколько цифр, за которыми следует точка. Знак вопроса, в конце концов, означает, что эта полная группа является необязательной.
Регулярные выражения — это очень широкая тема, и чтобы получить краткий обзор, перейдите по ссылке:/регулярные-выражения-java[эта связанная статья Baeldung]
А пока давайте создадим метод, используя приведенное выше регулярное выражение:
public static boolean isNumeric(String strNum)
Давайте теперь посмотрим на некоторые утверждения для вышеуказанного метода:
assertThat(isNumeric("22")).isTrue(); assertThat(isNumeric("5.05")).isTrue(); assertThat(isNumeric("-200")).isTrue(); assertThat(isNumeric("abc")).isFalse();
5. Использование Apache Commons
В этом разделе мы обсудим различные методы, доступные в библиотеке Apache Commons.
5.1. NumberUtils.isCreatable (String)
_https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/math/NumberUtils.html[NumberUtils] из Apache Commons предоставляет статический метод https://commons.apache . org/Proper/commons-lang/apidocs/org/apache/commons/lang3/math/NumberUtils.html # isCreatable-java.lang.String-[NumberUtils.isCreatable (String)] , который проверяет, является ли _ действительным номер Java или не.
, Шестнадцатеричные числа, начинающиеся с 0x или 0X
, Восьмеричные числа, начинающиеся с 0
, Научная нотация (например, 1.05e-10)
, Числа, помеченные квалификатором типа (например, 1L или 2.2d)
Если предоставленная строка _null или empty/blank , то она не считается числом, и этот метод вернет false _ в этом случае
Давайте запустим несколько тестов, используя этот метод:
assertThat(NumberUtils.isCreatable("22")).isTrue(); assertThat(NumberUtils.isCreatable("5.05")).isTrue(); assertThat(NumberUtils.isCreatable("-200")).isTrue(); assertThat(NumberUtils.isCreatable("10.0d")).isTrue(); assertThat(NumberUtils.isCreatable("1000L")).isTrue(); assertThat(NumberUtils.isCreatable("0xFF")).isTrue(); assertThat(NumberUtils.isCreatable("07")).isTrue(); assertThat(NumberUtils.isCreatable("2.99e+8")).isTrue(); assertThat(NumberUtils.isCreatable(null)).isFalse(); assertThat(NumberUtils.isCreatable("")).isFalse(); assertThat(NumberUtils.isCreatable("abc")).isFalse(); assertThat(NumberUtils.isCreatable(" 22 ")).isFalse(); assertThat(NumberUtils.isCreatable("09")).isFalse();
Обратите внимание, как мы получаем _true _ утверждения для шестнадцатеричных чисел, восьмеричных чисел и научных обозначений в строках 6, 7 и 8 соответственно.
Также в строке 14 строка _ «09» turns false because предыдущего «0» указывает, что это восьмеричное число, а «09» _ не является действительным восьмеричным числом.
Для каждого ввода, которое возвращает _true с помощью этого метода, мы можем использовать https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/math/NumberUtils.html#createNumber-java.lang .String -[ NumberUtils.createNumber (String) _ ], который даст нам правильный номер.
5.2. NumberUtils.isParsable (String)
Метод _https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/math/NumberUtils.html#isParsable-java.lang.String-[NumberUtils.isParsable (String)] проверяет, является ли данная String _ анализируемой или нет.
- Разборные числа — это те, которые успешно анализируются любым методом разбора, например Integer.parseInt (String) , Long.parseLong (String) , _Float.parseFloat (String)or Double.parseDouble (String) _ . **
В отличие от NumberUtils.isCreatable () , этот метод не принимает шестнадцатеричные числа, научные записи или строки, заканчивающиеся любым квалификатором типа, например _ ‘f’, ‘F’, ‘d’, ‘D’, ‘l’ or ‘ L»._
Давайте посмотрим на некоторые утверждения:
assertThat(NumberUtils.isParsable("22")).isTrue(); assertThat(NumberUtils.isParsable("-23")).isTrue(); assertThat(NumberUtils.isParsable("2.2")).isTrue(); assertThat(NumberUtils.isParsable("09")).isTrue(); assertThat(NumberUtils.isParsable(null)).isFalse(); assertThat(NumberUtils.isParsable("")).isFalse(); assertThat(NumberUtils.isParsable("6.2f")).isFalse(); assertThat(NumberUtils.isParsable("9.8d")).isFalse(); assertThat(NumberUtils.isParsable("22L")).isFalse(); assertThat(NumberUtils.isParsable("0xFF")).isFalse(); assertThat(NumberUtils.isParsable("2.99e+8")).isFalse();
В строке 4, в отличие от NumberUtils.isCreatable () , число, начинающееся со строки _ «0» _ , не считается восьмеричным числом, но является нормальным десятичным числом и, следовательно, возвращает значение true.
Мы можем использовать этот метод в качестве замены того, что мы делали в разделе 3, где мы пытаемся проанализировать число и проверить наличие ошибки.
5.3. _StringUtils.isNumeric (CharSequence ) ___
Метод _https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isNumeric-java.lang.CharSequence-[StringUtils.isNumeric (CharSequence)] _ строго проверяет для цифр Юникода. Это означает:
, Любые цифры с любого языка, которые являются цифрами Unicode, являются приемлемыми
, Так как десятичная точка не считается цифрой Unicode, это не
действительный , Ведущие знаки (положительные или отрицательные) также не принимаются
Давайте теперь посмотрим на этот метод в действии:
assertThat(StringUtils.isNumeric("123")).isTrue(); assertThat(StringUtils.isNumeric("١٢٣")).isTrue(); assertThat(StringUtils.isNumeric("१२३")).isTrue(); assertThat(StringUtils.isNumeric(null)).isFalse(); assertThat(StringUtils.isNumeric("")).isFalse(); assertThat(StringUtils.isNumeric(" ")).isFalse(); assertThat(StringUtils.isNumeric("12 3")).isFalse(); assertThat(StringUtils.isNumeric("ab2c")).isFalse(); assertThat(StringUtils.isNumeric("12.3")).isFalse(); assertThat(StringUtils.isNumeric("-123")).isFalse();
Обратите внимание, что входные параметры в строках 2 и 3 представляют числа __123 на арабском и деванагари соответственно. Так как они являются действительными цифрами Unicode, этот метод возвращает true __onon.
5.4. StringUtils.isNumericSpace (CharSequence)
Https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isNumericSpace-java.lang.CharSequence-[ StringUtils.isNumericSpace(CharSequence) ]проверяет строго для цифр Юникод и/или пробела. Это то же самое, что и _StringUtils.isNumeric () _ , с той лишь разницей, что он также принимает пробелы, не только начальные и конечные пробелы, но также, если они находятся между числами:
assertThat(StringUtils.isNumericSpace("123")).isTrue(); assertThat(StringUtils.isNumericSpace("١٢٣")).isTrue(); assertThat(StringUtils.isNumericSpace("")).isTrue(); assertThat(StringUtils.isNumericSpace(" ")).isTrue(); assertThat(StringUtils.isNumericSpace("12 3")).isTrue(); assertThat(StringUtils.isNumericSpace(null)).isFalse(); assertThat(StringUtils.isNumericSpace("ab2c")).isFalse(); assertThat(StringUtils.isNumericSpace("12.3")).isFalse(); assertThat(StringUtils.isNumericSpace("-123")).isFalse();
6. Ориентиры
Прежде чем мы завершим эту статью, давайте кратко рассмотрим результаты тестов, которые помогут нам проанализировать, какие из перечисленных методов являются оптимальными:
Benchmark Mode Cnt Score Error Units Benchmarking.usingCoreJava avgt 20 152.061 ± 24.300 ns/op Benchmarking.usingRegularExpressions avgt 20 1299.258 ± 175.688 ns/op Benchmarking.usingNumberUtils__isCreatable avgt 20 63.811 ± 5.638 ns/op Benchmarking.usingNumberUtils__isParsable avgt 20 58.706 ± 5.299 ns/op Benchmarking.usingStringUtils__isNumeric avgt 20 35.599 ± 8.498 ns/op Benchmarking.usingStringUtils__isNumericSpace avgt 20 37.010 ± 4.394 ns/op
Как мы видим, наиболее дорогостоящая операция с регулярными выражениями, за которой следует базовое решение на основе Java. Все остальные операции, использующие библиотеку Apache Commons, в целом одинаковы.
7. Заключение
В этой статье мы исследовали различные способы выяснить, является ли _String _ числовым или нет. Мы рассмотрели оба решения — встроенные методы, а также внешние библиотеки.
Как всегда, реализацию всех приведенных выше примеров и фрагментов кода, включая код, используемый для выполнения тестов, можно найти по адресу over на GitHub .
Как проверить является ли строка числом 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 > >
Другой пример реализации метода с помощью регулярных выражений :
public static boolean isNumber(String str) return str.matches("-?\\d+"); >
Приведенный ниже метод 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; > >