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

Как проверить, является ли String числовым в Java

Как бы вы проверили, была ли строка числом до ее разбора?

Обычно это делается с помощью простой пользовательской функции (т.е. функция Roll-your-own «isNumeric»).

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

Альтернативным подходом может быть использование регулярного выражения для проверки действительности числа:

Однако будьте осторожны с вышеупомянутым механизмом RegEx, поскольку он будет терпеть неудачу, если вы используете неарабские цифры (например, цифры, отличные от 0 до 9). Это связано с тем, что часть «\ d» RegEx будет соответствовать только 8 и эффективно не воспринимается на международном уровне. (Спасибо OregonGhost за это!)

Вы также можете использовать StringUtils.isNumericSpace который возвращает true для пустых строк и игнорирует внутренние пробелы в строке. Другим способом является использование StringUtils.isParsable который в основном проверяет, является ли число StringUtils.isParsable для StringUtils.isParsable в соответствии с Java. (Связанные javadocs содержат подробные примеры для каждого метода.)

если вы находитесь на android, вы должны использовать:

ОБНОВЛЕНИЕ: Как указал Жан-Франсуа Корбетт в комментарии, вышеуказанный код будет только проверять положительные целые числа, которые охватывают большинство моих вариантов использования. Ниже приведен обновленный код, который корректно проверяет десятичные числа в соответствии с языковой установкой по умолчанию, используемой в вашей системе, с предположением, что разделитель десятичных знаков встречается только один раз в строке.

Ява-выражения Java 8.

Не используйте исключения для проверки ваших значений. Используйте Util libs вместо apache NumberUtils:

Изменить:

Обратите внимание, что если ваша строка начинается с 0, NumberUtils будет интерпретировать ваше значение как шестнадцатеричное.

Почему все, кто настаивает на решениях exception/regex?

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

То, что я здесь делал, это взять регулярное выражение, методы parseNumber() и метод поиска массива, чтобы узнать, какой из них наиболее эффективен. На этот раз я только посмотрел на целые числа.

Результаты в скорости, которые я получил, были:

Отказ от ответственности: я не утверждаю, что эти методы на 100% оптимизированы, они просто для демонстрации данных

Исключения выиграны, если и только если число равно 4 символам или меньше, и каждая строка всегда является числом. в этом случае, почему даже есть чек?

Короче говоря, очень сложно, если вы часто сталкиваетесь с недопустимыми числами с помощью try/catch, что имеет смысл. Важным правилом, которым я всегда придерживаюсь, является НИКОГДА не использовать try/catch для потока программы. Это пример.

Интересно, что простой, если char 9 было чрезвычайно просто писать, легко запоминаться (и должно работать на нескольких языках) и выигрывает почти все тестовые сценарии.

Единственным недостатком является то, что я предполагаю, что Integer.parseInt() может обрабатывать не ASCII-номера, тогда как метод поиска массива не работает.

Для тех, кто задавался вопросом, почему я сказал, что легко запомнить массив символов, если вы не знаете никаких отрицательных признаков, вы можете легко уйти от чего-то сжатого, как это:

Наконец, в качестве заключительной заметки, мне было интересно узнать оператора-ассистента в принятом примере со всеми голосами. Добавление в присваивание

не только бесполезен, поскольку вы даже не используете его, но он тратит время обработки и увеличивает время выполнения на несколько наносекунд (что привело к увеличению тестов на 100-200 мс). Я не понимаю, почему кто-то это сделает, поскольку на самом деле это дополнительная работа для снижения производительности.

Вы подумали бы, что это будет оптимизировано. хотя, возможно, я должен проверить байт-код и посмотреть, что делает компилятор. Это не объясняет, почему это всегда показалось мне более длинным, хотя если оно каким-то образом оптимизировано. поэтому я задаюсь вопросом, что происходит. В качестве примечания: по длине я имею в виду запуск теста для 10000000 итераций, и запуск этой программы несколько раз (10x +) всегда показывал, что она медленнее.

Читайте также:  Как узнать есть ли у человека вши

Источник

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

Я делал так, но мне кажется такой подход в чем-то неправильным:

eZV9f

9 ответов 9

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

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

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

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

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

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

d8Z7F

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

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

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

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

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

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 варианта:

Делаем тестовый прогон на 10_000 элементах.

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

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

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

Источник

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

если у меня есть эти строки:

есть ли команда, например IsNumeric или что-то еще, которая может определить, является ли строка допустимым числом?

21 ответов:

обновление начиная с C# 7:

The ВАР s могут быть заменены их соответствующими типами!

Edit: На самом деле я думаю, что это лучше, чем TryParse, потому что очень длинная строка может потенциально переполнить TryParse.

вернет true для всех цифр (не float ) и false если входная строка является какой-либо буквенно-цифровой.

обратите внимание: stringTest не должна быть пустой строкой, так как это будет проходить тест на числовое значение.

я использовал эту функцию несколько раз:

но вы также можете использовать;

это, вероятно, лучший вариант в C#.

если вы хотите знать, если строка содержит целое число (целое число):

метод TryParse попытается преобразовать строку в число (целое число), и если это удастся, он вернет true и поместит соответствующее число в myInt. Если он не может, он возвращает false.

решениями int.Parse(someString) альтернатива, показанная в других ответах, работает, но она намного медленнее, потому что выбрасывание исключений очень дорогой. TryParse(. ) был добавлен в язык C# в версии 2, а до тех пор у вас не было выбора. Теперь вы делаете: поэтому вы должны избегать Parse() альтернативы.

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

результат будет тогда = True

Читайте также:  Как есть на шпагат в домашних условиях

результат будет тогда = False

в случае, если вы не хотите использовать int.Разобрать или удвоить.Разбор, вы можете свернуть свой собственный с чем-то вроде этого:

прост в использовании:

или, если вы хотите проверить другие типы чисел, вы можете указать «стиль». Итак, чтобы преобразовать число с показателем степени, вы можете использовать:

или чтобы проверить потенциальную шестнадцатеричную строку, вы можете использовать:

необязательный параметр «культура» может использоваться почти таким же образом.

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

Если вы хотите поймать более широкий спектр чисел, а-ля PHP is_numeric, вы можете использовать следующее:

если вы хотите проверить, является ли строка числом (я предполагаю, что это строка, так как если это число, вы знаете, что это один).

вы также можете сделать:

это будет заботиться о обычных гадостей:

вам придется добавить ссылку на System.Numerics и using System.Numerics; на вершине вашего класса (ну, второй бонус я думаю:)

вы можете использовать TryParse, чтобы определить, если строка может быть проанализирована в целое число.

логическое значение скажет вам, если это сработало или нет.

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

я в конечном итоге на этот вопрос через Google, потому что я хотел проверить, если string был numeric так что я мог бы просто использовать double.Parse(«123») вместо TryParse() метод.

почему? Потому что это раздражает, чтобы объявить out переменная и проверить результат TryParse() перед вами сейчас, если разбор не удался или нет. Я хочу использовать ternary operator чтобы проверить, если string это numerical а затем просто разобрать его в первом тернарном выражении или предоставить значение по умолчанию во втором тернарном выражении.

это просто намного чище, чем:

я сделал пару extension methods для этих случаев:

метод расширения один

пример:

метод использует отражение и вы в конечном итоге вызов TryParse() метод дважды, который, конечно, не так эффективен, но не все должно быть полностью оптимизировано, иногда удобство просто более важно.

этот метод также может быть использован для простого анализа списка числовых строки в список double или какой-либо другой тип со значением по умолчанию без необходимости ловить какие-либо исключения:

метод расширения два

этот метод расширения позволяет анализировать a string как и любой type что есть TryParse() метод, а также позволяет указать значение по умолчанию для возврата, если преобразование не удается.

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

Источник

Проверка строки на число

Доброго времени суток. Подскажите пожалуйста, как можно проверить строку на целое число и вернуть интовое значение в поле?

Проверка условия конвертации строки в число
Здравствуйте! Задача: имеется строка с рандомным набором символов. Необходимо из строки забрать все.

Проверка строки на число
Здравствуйте. Почему когда я ввожу буквы вместо числа, то цикл не выполняется и выводится b.

Проверка строки на шестнадцатеричное число
var s: string; i: integer; f: boolean; begin f := true; WriteLn(‘Введите строку.

Проверка строки на вещественное число
Все готово, теперь нужно куда-нибудь запихнуть условие, если число будет не только вещественным, но.

Решение

Возвращаемся к началу, как быть если число не int?

Что за приложение у вас?
Если это не учебное задание, а реальное приложение, то вам надо научиться разделять ДАННЫЕ и их ПРЕДСТАВЛЕНИЕ.

Использование в сеттере свойства обращение к каким-то внешним значениям. не есть хорошо.
Пользователь взаимодействует с данными через их представление.
И все методы валидации ввода пользователя находятся в части отвечающей за пользовательский интерфейс.
И WPF, и в WinForms для этого есть специальные методы и типовые решения.

Читайте также:  Как по английски будет можно покататься на

Элд Хасп, Программку пишу другу, она у меня как тренеровачная. Естественно это не финальный вариант. Если вам не сложно, можете показать вариант реализации проверки в сеттерах?

Добавлено через 3 минуты
И в каких случаях его используют, а в каких нет?

Сергей 0106, тренировочная.
А что вы тренируете?
Без деталей не возможен и детальный ответ.

Какого типа приложение: WinForms, WPF, Console?
Какой паттерн реализуете?
Как разделены данные и представление?

Попробую объяснить в общем случае.
В сеттере свойства идёт присвоение значения свойству.
Значение присваивается через параметр value.
В вашем же случае я, вообще, не вижу его использования.

То есть вы присваиваете значение строковому свойству, а оно по неизвестной причине может выдать исключение.
Это очень непрозрачное проведение.
Вообще, непонятно по какой причине для свойства Height выбран строковый тип?
А хранится его значение в поле целого типа.

Свойство и поле должны иметь одинаковый тип.
В сеттере свойства может быть допустим проверка на диапазон.
И то, если брать за пример реализации Net, не должно быть исключений.

А вот при приведении ПРЕДСТАВЛЕНИЯ к ДАННЫМ в View (интерфейсе пользователя), надо проверять возможно ли такое приведение. В том числе и может быть исключение, которое обрабатывается уровнем выше. Может быть какой-то метод валидации с отображением ошибки. В WPF есть для этого специальный механизм.

Источник

Как узнать, содержит ли слово в строке цифры?

У меня вопрос: как определить, есть ли в слове в строке цифра или нет?

Что мне нужно сделать: написать программу, которая читает строку текста и выводит строку со всеми цифрами во всех целых числах, замененными на ‘x’.

Мой ИД пользователя — john17, а мой 4-значный пин-код — 1234, который является секретным.

Мой идентификатор пользователя — john17, а мой пин-код x — xxxx, который является секретным.

Обратите внимание, что цифры в john17 не влияют.

Код у меня так далеко:

Решение

Есть много методов, которые вы можете использовать. Ниже приведены некоторые из них:

Итерация по строке:
Например: «My userID is john17 and my 4 digit pin is 1234 which is secret.»

Установить логический флаг ( IsNumberOnly=true ) когда вы найдете цифру сразу после space характер и начать кэширование слова. Обратите внимание, что флаг false первоначально. Например второй ‘1’ в вашем примере это цифра сразу после space персонаж. Продолжайте итерации,

Обратите внимание, что здесь john17 не будут затронуты вообще. Даже это было 17john это не было бы затронуто.

2 — Если вы хотите использовать Библиотеку и C ++ 11, тогда вы можете прочитать и проверить слова одно за другим с помощью:

Для более подробной информации и примеров:

3 — Что-то вроде этого сделает свое дело:

Это всего лишь несколько примеров.

Надеюсь, это поможет!

Другие решения

Обратите внимание, что в нынешнем виде это имеет неопределенное поведение: если ваш ввод включает какие-либо символы, которые являются отрицательными числами при кодировании в char (например, символы с акцентами, умлауты и т. д. в ISO 8859- *), затем поведение isdigit не определено Каждый персонаж должен быть приведен к unsigned char перед передачей в isdigit дать определенное поведение в таких случаях.

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

Здесь я покажу, как использовать потоковый итератор, алгоритм all_of в сочетании с предикатом isdigit. Идея состоит в том, чтобы разбить входные данные на слова и, если все символы токена являются цифрами, заменить их на x.

Вы можете сделать что-то вроде этого:

для любой цифры, которую вы нашли, проверьте, начинается ли новое слово.

если это произойдет, заменить до конца последовательности цифр.

это будет работать, если имя не может начинаться с цифры.

Ваш формат ввода всегда выглядит так?

Мой ИД пользователя — john17, а мой 4-значный пин-код — 1234, который является секретным.

Затем просто проверьте, есть ли пробел перед цифрами или нет. Если да, то измените номер на ххххх, иначе нет.

Источник

Adblock
detector