Ich habe eine Zeichenfolge, die ich in meiner gesamten Anwendung lade und die sich von Zahlen zu Buchstaben und dergleichen ändert. Ich habe eine einfache if
Aussage, um zu sehen, ob sie Buchstaben oder Zahlen enthält, aber etwas funktioniert nicht ganz richtig. Hier ist ein Ausschnitt.
String text = "abc";
String number;
if (text.contains("[a-zA-Z]+") == false && text.length() > 2) {
number = text;
}
Obwohl die text
Variable Buchstaben enthält, gibt die Bedingung as zurück true
. Das und &&
sollte als beide Bedingungen ausgewertet werden, true
um das zu verarbeitennumber = text;
==============================
Lösung:
Ich konnte dies mithilfe des folgenden Codes lösen, der durch einen Kommentar zu dieser Frage bereitgestellt wurde. Alle anderen Beiträge sind ebenfalls gültig!
Was ich verwendet habe, das funktioniert hat, kam aus dem ersten Kommentar. Obwohl alle angegebenen Beispielcodes ebenfalls gültig zu sein scheinen!
String text = "abc";
String number;
if (Pattern.matches("[a-zA-Z]+", text) == false && text.length() > 2) {
number = text;
}
quelle
matches("\\d{2,}")
oder versuchen Sie es mit einemPattern
undMatcher
Pattern.matches("[a-zA-Z]+", text) == false
kann vereinfacht werden!Pattern.matches("[a-zA-Z]+", text)
boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));
FormularMax Malysh
Post.Antworten:
Wenn Sie die Nummer als Text verarbeiten, ändern Sie:
zu:
Anstatt zu überprüfen, ob die Zeichenfolge keine alphabetischen Zeichen enthält, stellen Sie sicher, dass sie nur numerische Zeichen enthält .
Wenn Sie den numerischen Wert tatsächlich verwenden möchten, verwenden Sie
Integer.parseInt()
oderDouble.parseDouble()
wie andere unten erläutert haben.Als Randnotiz wird es allgemein als schlechte Praxis angesehen, boolesche Werte mit
true
oder zu vergleichenfalse
. Verwenden Sie einfachif (condition)
oderif (!condition)
.quelle
^[0-9]+$
), andernfallsabc123def
wird dies als Zahl betrachtet.matches()
Gibt nur dann true zurück, wenn es sich um eine vollständige Übereinstimmung von Anfang bis Ende handelt.&& (text.length() > 2)
. Alles kann im Regex-Muster überprüft werden:if (text.matches("[0-9]{3,}")
Sie können auch NumberUtil.isCreatable (String str) von Apache Commons verwenden
quelle
NumberUtil.isCreatable(String str)
es richtig ist, das zu verwenden, was die ursprüngliche Frage verlangt. ZB gibtNumberUtil.isCreatable( "09" )
zurückfalse
, obwohl es"09"
nur Zahlen enthält .So würde ich es machen:
Dadurch
$
wird eine teilweise Übereinstimmung vermieden, z.1B
.quelle
text.length() > 2
Teil, so dass ich nur ersetzt^[0-9]*$
durch^[0-9]+$
sicher sein , ich habe mindestens eine Zahl.In
parseInt
Bezug auf die Leistung und dergleichen sind sie viel schlechter als andere Lösungen, da zumindest eine Ausnahmebehandlung erforderlich ist.Ich habe jmh-Tests ausgeführt und festgestellt, dass das Überlaufen von String using
charAt
und das Vergleichen von Zeichen mit Grenzzeichen der schnellste Weg ist, um zu testen, ob der String nur Ziffern enthält.JMH-Tests
Tests vergleichen die Leistung von
Character.isDigit
vsPattern.matcher().matches
vs.Long.parseLong
vs überprüfen Zeichenwerte.Diese Methoden können zu unterschiedlichen Ergebnissen für Nicht-ASCII-Zeichenfolgen und Zeichenfolgen mit +/- Zeichen führen.
Tests werden im Durchsatzmodus ausgeführt ( größer ist besser ) mit 5 Aufwärmiterationen und 5 Testiterationen ausgeführt.
Ergebnisse
Beachten Sie, dass dies
parseLong
fast 100-mal langsamer ist alsisDigit
bei der ersten Testlast.Testsuite
Aktualisiert am 23. Februar 2018
charAt
eines zusätzlichen Arrays und einen mithilfeIntStream
von ZeichencodesAktualisiert am 23. Februar 2018
quelle
Verwenden Sie den folgenden Code, um einfach zu überprüfen, ob die Zeichenfolge nur ALPHABETS enthält:
Verwenden Sie den folgenden Code, um einfach zu überprüfen, ob die Zeichenfolge nur NUMBER enthält:
Hoffe das wird jemandem helfen!
quelle
boolean isNum = text.chars (). allMatch (c -> c> = 48 && c <= 57)
quelle
boolean isNum = text.chars().allMatch(c -> c >= '0' && c <= '9')
Sie können Regex.Match verwenden
Oder Sie könnten Onversionen wie
Integer.parseInt(String)
oder besserLong.parseLong(String)
für größere Zahlen verwenden, wie zum Beispiel:Und dann testen mit:
quelle
Die folgenden regulären Ausdrücke können verwendet werden, um zu überprüfen, ob eine Zeichenfolge nur eine Nummer hat oder nicht:
if (str.matches(".*[^0-9].*")) or if (str.matches(".*\\D.*"))
Beide oben genannten Bedingungen werden zurückgegeben,
true
wenn String Nicht-Zahlen enthält. Einfalse
, Zeichenfolge hat nur Zahlen.quelle
Apache Commons Lang stellt
org.apache.commons.lang.StringUtils.isNumeric(CharSequence cs)
als Argument a zur VerfügungString
und prüft, ob es aus rein numerischen Zeichen besteht (einschließlich Zahlen aus nicht-lateinischen Skripten). Diese Methode gibt zurückfalse
wenn Zeichen wie Leerzeichen, Minuszeichen, Pluszeichen und Dezimaltrennzeichen wie Komma und Punkt vorhanden sind.Andere Methoden dieser Klasse ermöglichen weitere numerische Überprüfungen.
quelle
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; } }
Es gibt viele Möglichkeiten, Zahlen von
String
s in Java zu erhalten (und umgekehrt). Möglicherweise möchten Sie den Regex-Teil überspringen, um sich die Komplikation zu ersparen.Sie könnten beispielsweise versuchen, herauszufinden, was
Double.parseDouble(String s)
für Sie zurückkehrt. Es sollte a auslösen,NumberFormatException
wenn es keinen geeigneten Wert in der Zeichenfolge findet. Ich würde diese Technik vorschlagen, da Sie den durch das dargestellten Wert tatsächlichString
als numerischen Typ verwenden könnten .quelle
Hier ist mein Code, hoffe das wird dir helfen!
quelle
Dieser Code ist bereits geschrieben. Wenn Ihnen der (extrem) geringfügige Leistungseinbruch nichts ausmacht - der wahrscheinlich nicht schlechter ist als ein Regex-Match -, verwenden Sie Integer.parseInt () oder Double.parseDouble () . Das wird Ihnen sofort sagen, ob ein String nur aus Zahlen besteht (oder gegebenenfalls aus einer Zahl). Wenn Sie längere Zahlenfolgen verarbeiten müssen, verwenden sowohl BigInteger- als auch BigDecimal - Sportkonstruktoren Zeichenfolgen. Jedes dieser Elemente löst eine NumberFormatException wenn Sie versuchen, eine Nicht-Zahl zu übergeben (ganzzahlig oder dezimal, natürlich basierend auf der von Ihnen ausgewählten). Alternativ können Sie je nach Ihren Anforderungen einfach die Zeichen in der Zeichenfolge iterieren und Character.isDigit () überprüfen.und / oder Character.isLetter () .
quelle
quelle
quelle
Beispiel für einen Arbeitstest
Trotzdem kann Ihr Code durch "1a" usw. unterbrochen werden, sodass Sie die Ausnahme überprüfen müssen
Die Methode zum Überprüfen von no ist string oder nicht
quelle
Es ist eine schlechte Praxis, Ausnahmen in ein solches typisches Szenario zu werfen.
Daher ist ein parseInt () nicht schön, aber ein
regulärer
Ausdruck ist eine elegante Lösung dafür. Achten Sie jedoch auf Folgendes: - Brüche - negative Zahlen
- Dezimaltrennzeichen können sich manchmal in Kontra (z. B. ',' oder '.')
Unterscheiden Es darf ein sogenanntes Tausendertrennzeichen wie ein Leerzeichen oder ein Komma haben, z. B. 12.324.1000.355
Um alle erforderlichen Fälle in Ihrer Anwendung zu behandeln, müssen Sie vorsichtig sein. Dieser reguläre Ausdruck deckt jedoch die typischen Szenarien ab (positiv / negativ und gebrochen, durch einen Punkt getrennt): ^ [- +]? \ D *.? \ D + $
For Testen empfehle ich regexr.com .
quelle
Leicht modifizierte Version von Adam Bodrogi:
Musste dies heute verwenden, also habe ich gerade meine Änderungen gepostet. Beinhaltet Währung, Tausend Komma oder Punktnotation und einige Validierungen. Enthält keine anderen Währungsnotationen (Euro, Cent), Bestätigungskommas sind jede dritte Ziffer.
quelle