Проверить что строка содержит только цифры java
Проверьте, содержит ли строка числа Java
Я пишу программу, в которой пользователь вводит строку в следующем формате:
что я могу использовать в качестве решения для поиска и извлечение?
14 ответов
Если вы хотите извлечь первое число из входной строки, вы можете сделать-
для ввода «123abc», метод выше будет возвращать 123.
для «abc1000def», 1000.
для «abc», вернет пустую строку.
s=s.replaceAll(«[*a-zA-Z]», «») заменяет все буквы
s=s.replaceAll(«[*0-9]», «») заменяет все цифры
если вы сделаете выше двух замен, вы получите все специальные символьные строки
если вы хотите извлечь только целые числа из String s=s.replaceAll(«[^0-9]», «»)
если вы хотите извлечь только буквы от String s=s.replaceAll(«[^a-zA-Z]», «»)
удачи в кодировании 🙂
Я не смог найти ни одного правильного шаблона. Пожалуйста, следуйте ниже руководство для небольшого и сладкого решения.
приведенного ниже кода достаточно для «проверить, содержит ли строка числа в Java»
попробуйте следующий шаблон:
решение, с которым я пошел, выглядит так:
Я уверен, что это не идеальное решение, но это подходит моим потребностям. Спасибо всем за помощь. 🙂
вы можете попробовать это
поскольку вы не только хотите искать число, но и извлекать его, вы должны написать небольшую функцию, делая это за вас. Иди буква за буквой, пока не найдешь цифру. Ах, только что нашел для вас необходимый код на stackoverflow:найти целое число в строку. Посмотрите на принятый ответ.
.matches(«.*\d+.*») работает только для чисел, но не для других символов, таких как // или * etc.
ASCII находится в начале UNICODE, поэтому вы можете сделать что-то вроде этого:
Я уверен, что вы можете выяснить другие ценности.
Java String-посмотрите, содержит ли строка только числа, а не буквы
у меня есть строка, которую я загружаю во всем своем приложении, и она меняется с чисел на буквы и тому подобное. У меня простой if оператор, чтобы увидеть, содержит ли он буквы или цифры, но что-то не совсем работает правильно. Вот фрагмент.
устранение:
я смог решить эту проблему, используя следующий код, предоставленный комментарием к этому вопросу. Все остальные сообщения также действительны!
то, что я использовал, что сработало, пришло из первого комментария. Хотя все приведенные примеры кодов, по-видимому, также действительны!
16 ответов
если вы будете обрабатывать числа как текст, а затем изменить:
вместо того, чтобы проверить, что строка не содержат алфавитные символы, убедитесь, что он содержит только числа.
если вы действительно хотите использовать числовое значение, используйте Integer.parseInt() или Double.parseDouble() как уже объяснили ниже.
вы также можете использовать NumberUtil.isCreatable (String str) из Apache Commons
вот как я бы это сделал:
производительность-мудрый parseInt и они намного хуже, чем другие решения, потому что, по крайней мере, требуют обработки исключений.
Я запустил тесты jmh и обнаружил, что итерация по строке с помощью charAt и сравнение символов с граничными символами-самый быстрый способ проверить, содержит ли строка только цифры.
тестирование JMH
тесты сравнения производительности Character.isDigit vs Pattern.matcher().matches vs Long.parseLong vs проверка значений char.
тесты выполняются в режиме пропускной способности (больше лучше) С 5 итерациями разминки и 5 итерациями теста.
результаты
отметим, что parseLong почти в 100 раз медленнее, чем isDigit для первого теста.
тесты
Обновлено 23 февраля 2018
Обновлено 23 февраля 2018
есть много возможностей для получения номера от String s в Java (и наоборот). Возможно, вы захотите пропустить часть regex, чтобы избавить себя от этого усложнения.
например, вы можете попробовать и посмотреть, что Double.parseDouble(String s) возвращает для вас. Он должен бросить NumberFormatException если он не находит соответствующего значения в строке. Я бы предложил этот метод, потому что вы могли бы использовать значение, представленное String Как числовой тип.
вы можете использовать регулярное выражение.Матч
или вы можете использовать onversions как Integer.parseInt(String) или лучше Long.parseLong(String) для больших чисел например:
а затем проверить с:
другие методы этого класса допускают дальнейшие числовые проверки.
чтобы просто проверить строку, которая содержит только алфавиты, используйте следующий код:
чтобы просто проверить строку, которая содержит только номер, используйте следующий код:
надеюсь, это поможет кому-то!
этот код уже написан. Если вы не против (очень) малой производительности-это, вероятно, не хуже, чем regex матча-используйте целое число.parseInt() или двойной.parseDouble(). Это сразу скажет вам, Является ли строка только числами (или это номер, в зависимости от обстоятельств). Если вам нужно обрабатывать более длинные строки чисел, оба BigInteger и BigDecimal спорт конструкторы, которые принимают строки. Любой из эти бросят NumberFormatException Если вы попытаетесь передать ему не-число (интегральное или десятичное, на основе выбранного вами, конечно). Поочередно, в зависимости от ваших требований, просто повторите символы в строке и проверьте символ.isDigit() и/или
ниже regexs можно использовать, чтобы проверить, имеет ли строка только номер или нет:
if (str.matches(«.*[^0-9].*»)) or if (str.matches(«.*\D.*»))
рабочий тестовый пример
все еще ваш код может быть сломан «1a» и т. д., Поэтому вам нужно проверить исключение
метод проверки нет-строка или нет
Это плохая практика, чтобы включить любое исключение бросая / обработки в такой типичный сценарий.
поэтому parseInt () не очень хорош, но регулярное выражение является элегантным решением для этого, но позаботьтесь о следующем:
— дроби
-отрицательные числа
— десятичный разделитель может отличаться в Контри (например,’, ‘ или ‘.’)
— иногда разрешается иметь так называемый тысячный разделитель, например пробел или запятую, например 12,324,1000.355
Java: Проверьте, является ли строка числом
В этом уроке мы рассмотрим примеры того, как проверить, представляет ли строка число в Java. Мы будем использовать основную Java и библиотеку Apache Commons, а также регулярные выражения.
Вступление
Строки-это удобный способ передачи информации и получения входных данных от пользователя.
В этой статье мы рассмотрим несколько способов проверить, является ли строка числовой в Java – то есть, представляет ли строка числовое значение.
Проверьте, является ли строка числовой с помощью ядра Java
Пользователи, как правило, довольно часто вводят неверные входные значения, поэтому разработчикам приходится как можно больше держать их за руку во время операций ввода-вывода.
Самый простой способ проверить, является ли строка числовой или нет,-это использовать один из следующих встроенных методов Java:
Давайте попробуем это:
Теперь мы можем абстрагировать эту функциональность в вспомогательный метод для удобства:
Теперь мы можем просто позвонить:
Выполнение этого кода приведет к:
Проверьте, является ли строка числовой с помощью Apache Commons
Apache Commons является одной из наиболее часто используемых сторонних библиотек для расширения базовой платформы Java. Это дает нам более точный контроль над основными классами Java, в данном случае строками.
Мы рассмотрим два класса из библиотеки Apache Commons:
Оба из которых очень похожи на их аналоги ванильного класса Java, но с акцентом на безопасные для нуля операции (для чисел и строк соответственно), что означает, что мы даже можем определить значения по умолчанию для отсутствующих ( нулевых ) значений.
Давайте теперь посмотрим, как мы можем проверить числовые значения с помощью этих методов.
числа.Сопоставимо()
Этот метод принимает строку и проверяет, является ли это анализируемым числом или нет, мы можем использовать этот метод вместо того, чтобы перехватывать исключение при вызове одного из методов, о которых мы упоминали ранее.
Это очень хорошо, потому что решений, связанных с частой обработкой исключений, следует по возможности избегать – именно в этом нам помогает этот метод.
Обратите внимание, что шестнадцатеричные числа и научные обозначения не считаются поддающимися анализу.
Теперь нам даже не нужен вспомогательный метод для удобства, так как поддается анализу() возвращает логическое значение само по себе:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Этот код должен возвращать:
NumberUtils.isCreatable()
Теперь мы можем даже использовать что-то вроде:
числа.isDigits()
StringUtils.IsNumeric()
Используя этот метод, мы можем определить, можем ли мы проанализировать Строку в Целое число :
StringUtils.isNumericSpace()
Давайте проверим строку, содержащую числа и пробелы:
Проверьте, является ли строка числовой с помощью регулярного выражения
Несмотря на то, что большинство разработчиков будут довольны использованием уже реализованного метода, иногда у вас может быть очень специфическая проверка шаблонов:
И тогда мы можем вызвать этот метод:
Выполнение этого дает нам следующий результат:
Вывод
В этой статье мы рассмотрели несколько способов проверить, является ли строка числовой или нет (представляет собой число) в Java.
Как проверить, содержит ли строка только цифры в Java
В Java для класса String существует метод, называемый match, как использовать этот метод, чтобы проверить, имеет ли моя строка только цифры с регулярным выражением. Я пробовал с примерами ниже, но оба они вернули мне ложные результаты.
Согласно регулярным выражениям Java, + означает “один или несколько раз”, а \d означает “цифра”.
Примечание. “Двойная обратная косая черта” является escape-последовательностью для получения одной обратной косой черты, поэтому \\d в строке Java дает фактический результат: \d
Ссылки:
Изменить: из-за некоторой путаницы в других ответах я пишу тестовый пример и подробно объясню некоторые вещи.
Во-первых, если вы сомневаетесь в правильности этого решения (или других), запустите этот тестовый пример:
Вопрос 1:
Нет. В java метод matches (который был указан в вопросе) соответствует полной строке, а не фрагментам. Другими словами, нет необходимости использовать ^\\d+$ (хотя это также правильно). Пожалуйста, посмотрите последний негативный тестовый пример.
Вопрос 2:
Нет. Регулярное выражение \\d* будет соответствовать пустой строке, но \\d+ – нет. Звезда * означает ноль или более, тогда как плюс + означает один или более. Пожалуйста, посмотрите первый отрицательный тестовый пример.
Вопрос 3
Не быстрее ли скомпилировать шаблон регулярных выражений?
Вы также можете использовать NumberUtil.isNumber(String str) из Apache Commons
Еще одно решение, которое еще не было опубликовано:
и исключение catch, оно обрабатывает знак минус.
Несмотря на то, что количество цифр ограничено, это фактически создает переменную данных, которые могут быть использованы, что, я думаю, является наиболее распространенным вариантом использования.
Вы должны разрешить больше цифры (знак + ), как в:
Использование регулярных выражений является дорогостоящим с точки зрения производительности. Попытка разобрать строку как длинное значение неэффективна и ненадежна, и может быть не то, что вам нужно.
Я предлагаю просто проверить, является ли каждый символ цифрой, что можно эффективно выполнить с помощью ямбда-выражений Java 8:
В соответствии с Oracle Java Documentation:
шаблон 9 означает цифру. То же, что и ‘\ d’.
“+” означает, что он появляется больше раз.
” для integer или float.
Как проверить, является ли строка числовой в Java
Как бы вы проверили, была ли строка числом перед ее разбором?
30 ответов
вы также можете использовать StringUtils.isNumericSpace возвращает true для пустых строк и игнорирует внутренние пробелы в строке. (Связанной документации содержит подробные примеры для каждого метода.)
это обычно делается с помощью простой определяемой пользователем функции (т. е. свернуть свою собственную «числовую» функцию).
однако, если вы вызываете эту функцию много, и вы ожидаете, что многие из проверок потерпят неудачу из-за того, что не являются числом, производительность этого механизма не будет большой, так как вы полагаетесь на исключения, создаваемые для каждого сбоя, что является довольно дорогостоящей операцией.
альтернативным подходом может быть чтобы использовать регулярное выражение для проверки правильности числа:
будьте осторожны с вышеупомянутым механизмом регулярного выражения, хотя, поскольку он потерпит неудачу, если вы используете неарабские цифры (т. е. цифры, отличные от 0 до 9). Это связано с тем, что часть» \d » регулярного выражения будет соответствовать только 5 и фактически не является международной числовой информацией. (Спасибо OregonGhost за указание на это!)
или даже другой альтернативой является использование встроенного Java Ява.текст.Numberformat объект, чтобы увидеть, если после синтаксического анализа строки позиция синтаксического анализатора находится в конце строки. Если это так, мы можем предположить, что вся строка является числовым:
Если вы находитесь на Android, то вы должны использовать:
сохранить его простым. в основном каждый может «перепрограммировать» (то же самое).
UPDATE: как указал Жан-Франсуа Корбетт в комментарии, приведенный выше код будет проверять только положительные целые числа, которые охватывают большую часть моего варианта использования. Ниже приведен обновленный код, который правильно проверяет десятичные числа в соответствии с локалем по умолчанию, используемым в вашей системе, с предположением, что десятичный разделитель встречается только один раз в строке.
Java 8 лямбда-выражения.
не используйте исключения для проверки значений. Используйте util libs вместо apache NumberUtils:
редактировать:
обратите внимание, что если ваша строка начинается с 0, NumberUtils будет интерпретировать ваше значение как шестнадцатеричное.
почему все настаивают на решениях исключений / регулярных выражений?
хотя я могу понять, что большинство людей в порядке с использованием try / catch, если вы хотите делать это часто. это может быть чрезвычайно утомительно.
то, что я сделал здесь, это взять регулярное выражение, методы parseNumber() и метод поиска массива, чтобы увидеть, который был наиболее эффективным. На этот раз я смотрел только на целые числа.
результаты в скорости я получил были:
отказ от ответственности: я не утверждаю, что эти методы 100% оптимизированы, они просто для демонстрации данных
исключения выиграли, если и только если число 4 символа или меньше, и каждая строка всегда ряд. в таком случае зачем вообще чек?
короче говоря, это очень больно, если вы часто сталкиваетесь с недопустимыми числами с помощью try/catch, что имеет смысл. Важное правило я всегда следовать никогда не используйте try / catch для потока программы. Вот пример почему.
интересно, что простой, если char 9 был чрезвычайно прост в написании, легко запоминается (и должен работать на нескольких языках) и выигрывает почти все тестовые сценарии.
единственным недостатком является то, что я предполагаю целое число.parseInt () может обрабатывать номера, отличные от ASCII, в то время как метод поиска массива-нет.
для тех, кто интересуется, почему я сказал, что это легко помните, что массив символов один, если вы знаете, что нет отрицательных знаков, вы можете легко уйти с чем-то конденсированным, как это:
наконец, в качестве заключительного замечания мне было интересно узнать об операторе назначения в принятом примере со всеми голосами. Добавление в задание
не только бесполезно, так как вы даже не используете значение, но он тратит время обработки и увеличивает время выполнения на несколько наносекунд (что привело к 100-200 МС увеличение в тестах). Я не понимаю, зачем кому-то это делать, так как на самом деле это дополнительная работа для снижения производительности.
вы думаете, что это будет оптимизировано. хотя, возможно, я должен проверить байт-код и посмотреть, что делает компилятор. Это не объясняет, почему он всегда показывался мне более длинным, хотя если он каким-то образом оптимизирован. поэтому мне интересно, что происходит. Как Примечание: под lengthier я имею в виду запуск теста для 10000000 итераций и запуск этой программы несколько раз (10x+) всегда показывали, что он медленнее.
EDIT: обновлен тест для символа.isDigit()
также он будет отклонять любое число с ведущим’+’
альтернативой, которая позволяет избежать этих двух незначительных проблем, является