У меня есть строка, которую я загружаю по всему приложению, и она меняется с цифр на буквы и тому подобное. У меня есть простое if
утверждение, чтобы увидеть, содержит ли оно буквы или цифры, но что-то работает не совсем правильно. Вот фрагмент.
String text = "abc";
String number;
if (text.contains("[a-zA-Z]+") == false && text.length() > 2) {
number = text;
}
Хотя text
переменная содержит буквы, условие возвращается как true
. И &&
должны быть оценены как оба условия должны быть true
для обработкиnumber = text;
==============================
Решение:
Я смог решить эту проблему с помощью следующего кода, предоставленного комментарием по этому вопросу. Все остальные посты также действительны!
То, что я использовал, сработало из первого комментария. Хотя все приведенные примеры кодов, похоже, также действительны!
String text = "abc";
String number;
if (Pattern.matches("[a-zA-Z]+", text) == false && text.length() > 2) {
number = text;
}
java
string
if-statement
RedHatcc
источник
источник
matches("\\d{2,}")
или попробуйте сPattern
иMatcher
Pattern.matches("[a-zA-Z]+", text) == false
можно упростить до!Pattern.matches("[a-zA-Z]+", text)
boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));
формуMax Malysh
Post.Ответы:
Если вы будете обрабатывать число как текст, измените:
чтобы:
Вместо проверки того, что строка не содержит буквенных символов, убедитесь, что она содержит только цифры.
Если вы действительно хотите использовать числовое значение, используйте
Integer.parseInt()
или,Double.parseDouble()
как другие объяснили ниже.Как примечание, обычно считается плохой практикой сравнивать логические значения с
true
илиfalse
. Просто используйтеif (condition)
илиif (!condition)
.источник
^[0-9]+$
), иначеabc123def
будет считаться число.matches()
возвращает true тогда и только тогда, когда это полное совпадение от начала до конца.&& (text.length() > 2)
. Все можно проверить в регулярном выражении:if (text.matches("[0-9]{3,}")
Вы также можете использовать NumberUtil.isCreatable (String str) из Apache Commons.
источник
NumberUtil.isCreatable(String str)
правильно использовать для того, что просит оригинальный вопрос. Например,NumberUtil.isCreatable( "09" )
возвращаетсяfalse
, хотя"09"
содержит только цифры .Вот как я бы это сделал:
$
Позволит избежать частичного совпадения , например;1B
,источник
text.length() > 2
часть, поэтому я просто заменил^[0-9]*$
ее,^[0-9]+$
чтобы убедиться, что у меня есть хотя бы один номер.По производительности
parseInt
и тому подобное намного хуже, чем у других решений, потому что, по крайней мере, требуется обработка исключений.Я запустил тесты jmh и обнаружил, что перебор String с использованием
charAt
и сравнение символов с граничными символами - это самый быстрый способ проверить, содержит ли строка только цифры.JMH тестирование
Тесты сравнение производительности
Character.isDigit
противPattern.matcher().matches
противLong.parseLong
против проверки значений полукокса.Эти способы могут привести к разным результатам для строк, отличных от ascii, и строк, содержащих знаки +/-.
Тесты выполняются в режиме пропускной способности (чем больше, тем лучше ) с 5 итерациями прогрева и 5 итерациями теста.
Полученные результаты
Обратите внимание, что
parseLong
это почти в 100 раз медленнее, чемisDigit
при первой тестовой нагрузке.Тестирование
Обновлено 23 февраля 2018 г.
charAt
вместо создания дополнительного массива и другое использованиеIntStream
кодов символовОбновлено 23 февраля 2018 г.
источник
Чтобы просто проверить строку, которая содержит только ALPHABETS, используйте следующий код:
Чтобы просто проверить строку, которая содержит только NUMBER, используйте следующий код:
Надеюсь, это кому-нибудь поможет!
источник
логическое isNum = text.chars (). allMatch (c -> c> = 48 && c <= 57)
источник
boolean isNum = text.chars().allMatch(c -> c >= '0' && c <= '9')
Вы можете использовать Regex.Match
Или вы можете использовать инверсии вроде
Integer.parseInt(String)
или лучшеLong.parseLong(String)
для больших чисел, например:А затем проверьте с помощью:
источник
Ниже приведены регулярные выражения, чтобы проверить, имеет ли строка только номер или нет:
if (str.matches(".*[^0-9].*")) or if (str.matches(".*\\D.*"))
Оба условия выше вернутся,
true
если строка содержит не числа. Вfalse
строке есть только цифры.источник
Предоставляет Apache Commons Lang
org.apache.commons.lang.StringUtils.isNumeric(CharSequence cs)
, который принимает в качестве аргумента aString
и проверяет, состоит ли он из чисто цифровых символов (включая числа из нелатинских алфавитов). Этот метод возвращает,false
если есть символы, такие как пробел, минус, плюс, и десятичные разделители, такие как запятая и точка.Другие методы этого класса допускают дальнейшие числовые проверки.
источник
public static boolean isNumeric(String str) { if (str == null) { return false; } else { int sz = str.length(); for(int i = 0; i < sz; ++i) { if (!Character.isDigit(str.charAt(i))) { return false; } } return true; } }
Существует множество возможностей для получения чисел из
String
s в Java (и наоборот). Вы можете пропустить часть регулярных выражений, чтобы избавить себя от осложнений этого.Например, вы можете попробовать и посмотреть, что
Double.parseDouble(String s)
для вас возвращается. Он должен бросить a,NumberFormatException
если не находит подходящего значения в строке. Я бы предложил этот метод, потому что вы могли бы использовать значение, представленноеString
как числовой тип.источник
Вот мой код, надеюсь, это поможет вам!
источник
Этот код уже написан. Если вы не возражаете против (чрезвычайно) незначительного снижения производительности - что, вероятно, не хуже, чем сопоставление с регулярным выражением - используйте Integer.parseInt () или Double.parseDouble () . Это вам скажу сразу , если строка только цифры (или это число, в зависимости от обстоятельств). Если вам нужно обрабатывать более длинные строки чисел, оба спортивных конструктора BigInteger и BigDecimal, которые принимают строки. Любое из них вызовет исключение NumberFormatException, если вы попытаетесь передать ему не число (целое или десятичное, конечно, на основе того, которое вы выберете). Кроме того, в зависимости от ваших требований, просто переберите символы в строке и проверьте Character.isDigit ()и / или Character.isLetter () .
источник
источник
источник
Рабочий тестовый пример
Тем не менее, ваш код может быть разбит на «1a» и т. Д., Поэтому вам нужно проверить исключение
Метод проверки нет, строка или нет
источник
Это плохая практика - включать или исключать любые исключения в такой типичный сценарий.
Поэтому parseInt () нехорошо, но регулярное выражение является элегантным решением для этого, но позаботьтесь о следующем:
-fractions -отрицательные
числа
-decimal разделитель может отличаться по контурам (например, ',' или '.')
-Sometimes разрешено иметь так называемый разделитель тысяч, например, пробел или запятую, например, 12,324,1000,355
Чтобы обработать все необходимые случаи в вашем приложении, вы должны быть осторожны, но это регулярное выражение охватывает типичные сценарии (положительный / отрицательный и дробный, разделенные точкой): ^ [- +]? \ D *.? \ D + $
For тестирование, я рекомендую regexr.com .
источник
Слегка измененная версия Адама Бодроги:
Пришлось сегодня этим пользоваться, поэтому просто выложил мои модификации. Включает в себя валюту, тысячи запятых или обозначения периода, а также некоторые проверки. Не включает в себя обозначения других валют (евро, цент), запятые для проверки - каждая третья цифра.
источник