J'ai une chaîne que je charge tout au long de mon application, et elle change de chiffres en lettres et autres. J'ai une simple if
déclaration pour voir si elle contient des lettres ou des chiffres mais, quelque chose ne fonctionne pas tout à fait correctement. Voici un extrait.
String text = "abc";
String number;
if (text.contains("[a-zA-Z]+") == false && text.length() > 2) {
number = text;
}
Bien que la text
variable contienne des lettres, la condition retourne comme true
. Le et &&
doit être évalué comme les deux conditions devant être true
remplies pour traiter lenumber = text;
==============================
Solution:
J'ai pu résoudre ce problème en utilisant le code suivant fourni par un commentaire sur cette question. Tous les autres articles sont également valables!
Ce que j'ai utilisé qui a fonctionné est venu du premier commentaire. Bien que tous les exemples de codes fournis semblent également valables!
String text = "abc";
String number;
if (Pattern.matches("[a-zA-Z]+", text) == false && text.length() > 2) {
number = text;
}
la source
matches("\\d{2,}")
ou essayez avec unPattern
etMatcher
Pattern.matches("[a-zA-Z]+", text) == false
peut être simplifié pour!Pattern.matches("[a-zA-Z]+", text)
boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));
formeMax Malysh
Post.Réponses:
Si vous allez traiter le numéro sous forme de texte, modifiez:
à:
Au lieu de vérifier que la chaîne ne contient pas de caractères alphabétiques, vérifiez qu'elle ne contient que chiffres.
Si vous souhaitez réellement utiliser la valeur numérique, utilisez
Integer.parseInt()
ouDouble.parseDouble()
comme d'autres l'ont expliqué ci-dessous.En remarque, il est généralement considéré comme une mauvaise pratique de comparer les valeurs booléennes à
true
oufalse
. Utilisez simplementif (condition)
ouif (!condition)
.la source
^[0-9]+$
), sinonabc123def
sera considéré comme un nombre.matches()
renvoie vrai si et seulement si c'est une correspondance complète du début à la fin.&& (text.length() > 2)
. Tout peut être vérifié dans le modèle regex:if (text.matches("[0-9]{3,}")
Vous pouvez également utiliser NumberUtil.isCreatable (String str) depuis Apache Commons
la source
NumberUtil.isCreatable(String str)
soit correct d'utiliser ce que demande la question d'origine. Par exemple,NumberUtil.isCreatable( "09" )
renvoiefalse
, même s'il"09"
ne contient que des chiffres .Voici comment je le ferais:
Le
$
permettra d'éviter une correspondance partielle, par exemple;1B
.la source
text.length() > 2
pièce, j'ai donc juste remplacé^[0-9]*$
par^[0-9]+$
pour être sûr d'avoir au moins un numéro.Côté performance
parseInt
et autres sont bien pires que les autres solutions, car elles nécessitent au moins une gestion des exceptions.J'ai exécuté des tests jmh et j'ai constaté que l'itération sur String en utilisant
charAt
et en comparant les caractères avec les caractères de limite est le moyen le plus rapide de tester si la chaîne ne contient que des chiffres.Test JMH
Les tests comparent les performances de
Character.isDigit
vsPattern.matcher().matches
vsLong.parseLong
vs en vérifiant les valeurs char.Ces méthodes peuvent produire des résultats différents pour les chaînes non ascii et les chaînes contenant des signes +/-.
Les tests s'exécutent en mode de débit ( plus il vaut mieux, mieux c'est ) avec 5 itérations d'échauffement et 5 itérations de test.
Résultats
Notez que
parseLong
c'est presque 100 fois plus lent queisDigit
pour la première charge de test.Suite de tests
Mis à jour le 23 févr.2018
charAt
au lieu de créer un tableau supplémentaire et un autre en utilisantIntStream
des codes de caractèresMis à jour le 23 févr.2018
la source
Afin de vérifier simplement la chaîne qu'elle contient uniquement ALPHABETS, utilisez le code suivant:
Afin de vérifier simplement la chaîne qui ne contient que NUMBER, utilisez le code suivant:
J'espère que cela aidera quelqu'un!
la source
boolean isNum = text.chars (). allMatch (c -> c> = 48 && c <= 57)
la source
boolean isNum = text.chars().allMatch(c -> c >= '0' && c <= '9')
Vous pouvez utiliser Regex.Match
Ou vous pouvez utiliser des versions similaires
Integer.parseInt(String)
ou meilleuresLong.parseLong(String)
pour de plus grands nombres comme par exemple:Et puis testez avec:
la source
Les expressions rationnelles ci-dessous peuvent être utilisées pour vérifier si une chaîne n'a qu'un nombre ou non:
if (str.matches(".*[^0-9].*")) or if (str.matches(".*\\D.*"))
Les deux conditions ci-dessus seront
true
renvoyées si String contient des non-nombres. Activéfalse
, la chaîne n'a que des chiffres.la source
Apache Commons Lang fournit
org.apache.commons.lang.StringUtils.isNumeric(CharSequence cs)
, qui prend comme argument aString
et vérifie s'il se compose de caractères purement numériques (y compris des nombres provenant de scripts non latins). Cette méthode renvoiefalse
s'il existe des caractères tels que l'espace, le moins, le plus et les séparateurs décimaux tels que la virgule et le point.D'autres méthodes de cette classe permettent d'autres vérifications numériques.
la source
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; } }
Il existe de nombreuses fonctionnalités pour obtenir des numéros de
String
s en Java (et vice versa). Vous voudrez peut-être ignorer la partie regex pour vous éviter la complication de cela.Par exemple, vous pouvez essayer de voir ce qui vous
Double.parseDouble(String s)
rapporte. Il doit lancer unNumberFormatException
s'il ne trouve pas de valeur appropriée dans la chaîne. Je suggérerais cette technique car vous pourriez réellement utiliser la valeur représentée par leString
comme un type numérique.la source
Voici mon code, j'espère que cela vous aidera!
la source
Ce code est déjà écrit. Si cela ne vous dérange pas le coup de performance (extrêmement) mineur - qui n'est probablement pas pire que de faire une correspondance regex - utilisez Integer.parseInt () ou Double.parseDouble () . Cela vous dira tout de suite si une chaîne n'est que des nombres (ou est un nombre, selon le cas). Si vous devez gérer des chaînes de nombres plus longues, les constructeurs sportifs BigInteger et BigDecimal qui acceptent les chaînes. N'importe lequel de ces éléments générera une exception NumberFormatException si vous essayez de lui transmettre un non-nombre (intégral ou décimal, basé sur celui que vous choisissez, bien sûr). Alternativement, selon vos besoins, il suffit d'itérer les caractères dans la chaîne et de vérifier Character.isDigit ()et / ou Character.isLetter () .
la source
la source
la source
Exemple de test de travail
Votre code peut toujours être cassé par "1a", etc., vous devez donc vérifier l'exception
Méthode pour vérifier que non est une chaîne ou non
la source
C'est une mauvaise pratique d'impliquer toute exception de levée / manipulation dans un scénario aussi typique.
Par conséquent , un parseInt () n'est pas agréable, mais une expression régulière est une solution élégante pour cela, mais prendre soin de ce qui suit:
-fractions
numéros séronégatifs
séparateur -decimal peut différer contries ( « » par exemple « » ou)
-Parfois il est permis d'avoir un soi-disant séparateur de milliers, comme un espace ou une virgule, par exemple 12.324.1000.355
Pour gérer tous les cas nécessaires dans votre application, vous devez être prudent, mais cette expression régulière couvre les scénarios typiques (positifs / négatifs et fractionnaires, séparés par un point): ^ [- +]? \ D *.? \ D + $
For test, je recommande regexr.com .
la source
Version légèrement modifiée d'Adam Bodrogi:
J'ai dû utiliser cela aujourd'hui, alors je viens de publier mes modifications. Comprend la devise, la virgule des milliers ou la notation de période, et certaines validations. N'inclut pas les autres notations monétaires (euro, cent), les virgules de vérification sont tous les trois chiffres.
la source