Eu tenho uma string que eu carrego em todo o meu aplicativo, e ela muda de números para letras e tal. Eu tenho uma if
declaração simples para ver se ele contém letras ou números, mas algo não está funcionando corretamente. Aqui está um trecho.
String text = "abc";
String number;
if (text.contains("[a-zA-Z]+") == false && text.length() > 2) {
number = text;
}
Embora a text
variável contenha letras, a condição retorna como true
. A e &&
deve avaliar, pois ambas as condições precisam estar true
em ordem para processar onumber = text;
==============================
Solução:
Consegui resolver isso usando o código a seguir fornecido por um comentário sobre essa pergunta. Todas as outras postagens também são válidas!
O que eu usei que funcionou veio do primeiro comentário. Embora todos os códigos de exemplo fornecidos pareçam válidos também!
String text = "abc";
String number;
if (Pattern.matches("[a-zA-Z]+", text) == false && text.length() > 2) {
number = text;
}
java
string
if-statement
RedHatcc
fonte
fonte
matches("\\d{2,}")
ou tente com umPattern
eMatcher
Pattern.matches("[a-zA-Z]+", text) == false
pode ser simplificado para!Pattern.matches("[a-zA-Z]+", text)
boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));
formulário de API de streaming de javaMax Malysh
Post.Respostas:
Se você estiver processando o número como texto, altere:
para:
Em vez de verificar se a sequência não contém caracteres alfabéticos, verifique se ela contém apenas números.
Se você realmente deseja usar o valor numérico, use
Integer.parseInt()
ouDouble.parseDouble()
conforme explicado abaixo.Como observação, geralmente é considerado uma prática ruim comparar valores booleanos com
true
oufalse
. Basta usarif (condition)
ouif (!condition)
.fonte
^[0-9]+$
), caso contrárioabc123def
, será considerado um número.matches()
retorna true se e somente se for uma correspondência completa do começo ao fim.&& (text.length() > 2)
. Tudo pode ser verificado no padrão regex:if (text.matches("[0-9]{3,}")
Você também pode usar NumberUtil.isCreatable (String str) no Apache Commons
fonte
NumberUtil.isCreatable(String str)
correto usar o que a pergunta original pede. Por exemplo,NumberUtil.isCreatable( "09" )
retornafalse
, mesmo que"09"
contenha apenas números .É assim que eu faria:
O
$
evitará uma correspondência parcial, por exemplo;1B
.fonte
text.length() > 2
parte, então eu apenas substituído^[0-9]*$
por^[0-9]+$
ter certeza que eu tenho pelo menos um número.Em termos de desempenho,
parseInt
essas são muito mais piores do que outras soluções, porque pelo menos exigem tratamento de exceção.Fiz testes jmh e descobri que a iteração sobre String usando
charAt
e comparando caracteres com caracteres de limite é a maneira mais rápida de testar se a string contém apenas dígitos.Teste JMH
Os testes comparam o desempenho de
Character.isDigit
vsPattern.matcher().matches
vsLong.parseLong
vs valores de caracteres.Essas maneiras podem produzir resultados diferentes para cadeias não-ascii e cadeias contendo sinais +/-.
Os testes são executados no modo Taxa de transferência (quanto maior, melhor ) com 5 iterações de aquecimento e 5 iterações de teste.
Resultados
Observe que
parseLong
é quase 100 vezes mais lento queisDigit
na primeira carga de teste.Suíte de teste
Atualizado em 23 de fevereiro de 2018
charAt
vez de criar uma matriz extra e outro usandoIntStream
códigos de caracteresAtualizado em 23 de fevereiro de 2018
fonte
Para verificar simplesmente a string que contém apenas ALPHABETS, use o seguinte código:
Para verificar simplesmente a string que contém apenas NUMBER, use o seguinte código:
Espero que isso ajude alguém!
fonte
boolean isNum = text.chars (). allMatch (c -> c> = 48 && c <= 57)
fonte
boolean isNum = text.chars().allMatch(c -> c >= '0' && c <= '9')
Você pode usar o Regex.Match
Ou você pode usar versões iguais
Integer.parseInt(String)
ou superioresLong.parseLong(String)
a números maiores, como por exemplo:E depois teste com:
fonte
As regexs abaixo podem ser usadas para verificar se uma sequência possui apenas número ou não:
if (str.matches(".*[^0-9].*")) or if (str.matches(".*\\D.*"))
Ambas as condições acima retornarão
true
se String contiver não números. Ativadofalse
, a string possui apenas números.fonte
O Apache Commons Lang fornece
org.apache.commons.lang.StringUtils.isNumeric(CharSequence cs)
, que usa como argumentoString
ae verifica se ele consiste em caracteres puramente numéricos (incluindo números de scripts não latinos). Esse método retornaráfalse
se houver caracteres como espaço, menos, mais e separadores decimais, como vírgula e ponto.Outros métodos dessa classe permitem mais verificações numéricas.
fonte
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; } }
Existem muitas facilidades para obter números de
String
s em Java (e vice-versa). Você pode pular a parte do regex para poupar a complicação disso.Por exemplo, você pode tentar ver o que
Double.parseDouble(String s)
retorna para você. Deve lançar aNumberFormatException
se não encontrar um valor apropriado na string. Eu sugeriria essa técnica porque você poderia realmente usar o valor representado peloString
como um tipo numérico.fonte
Aqui está o meu código, espero que isso ajude você!
fonte
Este código já está escrito. Se você não se importa com o impacto (extremamente) de desempenho menor - o que provavelmente não é pior do que fazer uma correspondência de regex - use Integer.parseInt () ou Double.parseDouble () . Isso informará imediatamente se uma String é apenas um número (ou é um número, conforme apropriado). Se você precisar lidar com seqüências de números mais longas, os construtores de esporte BigInteger e BigDecimal que aceitam Strings. Qualquer uma dessas opções lançará uma NumberFormatException se você tentar passar um número não (integral ou decimal, com base na que você escolher, é claro). Como alternativa, dependendo dos seus requisitos, apenas itere os caracteres na String e marque Character.isDigit ()e / ou Character.isLetter () .
fonte
fonte
fonte
Exemplo de teste de trabalho
Ainda assim, seu código pode ser quebrado por "1a" etc., portanto, você precisa verificar a exceção
Método para verificar não é string ou não
fonte
É uma prática ruim envolver qualquer exceção lançando / manipulando um cenário tão típico.
Portanto, um parseInt () não é agradável, mas um regex é uma solução elegante para isso, mas cuidar do seguinte:
-fractions
números -negative
separador -decimal podem diferir em contries ( '' ex '' ou)
-Às vezes é permitido ter um chamado separador de milhar, como um espaço ou uma vírgula, por exemplo, 12.324.1000.355
Para lidar com todos os casos necessários no seu aplicativo, você deve ter cuidado, mas esse regex abrange os cenários típicos (positivo / negativo e fracionário, separados por um ponto): ^ [- +]? \ D *.? \ D + $
For teste, recomendo regexr.com .
fonte
Versão ligeiramente modificada de Adam Bodrogi:
Tive que usar isso hoje, então apenas postei minhas modificações. Inclui moeda, milhares de vírgulas ou notação de período e algumas validações. Não inclui outras notações de moeda (euro, cent), vírgulas de verificação são de três em três dígitos.
fonte