Wie würden Sie prüfen, ob ein String eine Zahl ist, bevor Sie ihn parsen?
Anstelle dieser vielen Prüfungen können wir einfach if (ch >= '0' && ch <= '9') {}
Wie würden Sie prüfen, ob ein String eine Zahl ist, bevor Sie ihn parsen?
Wenn Sie die Prüfung mit einem Regex durchführen wollen, sollten Sie ein endgültiges statisches Pattern-Objekt erstellen, so dass der Regex nur einmal kompiliert werden muss. Die Kompilierung der Regex dauert etwa so lange wie die Durchführung des Abgleichs, so dass Sie durch diese Vorsichtsmaßnahme die Ausführungszeit der Methode halbieren können.
final static Pattern NUMBER_PATTERN = Pattern.compile("[+-]?\\d*\\.?\\d+");
static boolean isNumber(String input) {
Matcher m = NUMBER_PATTERN.matcher(input);
return m.matches();
}
Ich gehe davon aus, dass eine Zahl eine Zeichenkette ist, die nur Dezimalziffern enthält, möglicherweise ein + oder - Zeichen am Anfang und höchstens einen Dezimalpunkt (nicht am Ende) und keine anderen Zeichen (einschließlich Kommas, Leerzeichen, Zahlen in anderen Zählsystemen, römische Ziffern, Hieroglyphen).
Diese Lösung ist kurz und ziemlich schnell, aber Sie können ein paar Millisekunden pro Million Aufrufe einsparen, indem Sie wie folgt vorgehen
static boolean isNumber(String s) {
final int len = s.length();
if (len == 0) {
return false;
}
int dotCount = 0;
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (c < '0' || c > '9') {
if (i == len - 1) {//last character must be digit
return false;
} else if (c == '.') {
if (++dotCount > 1) {
return false;
}
} else if (i != 0 || c != '+' && c != '-') {//+ or - allowed at start
return false;
}
}
}
return true;
}
Dies ist der schnellste Weg, den ich kenne, um zu prüfen, ob String eine Zahl ist oder nicht:
public static boolean isNumber(String str){
int i=0, len=str.length();
boolean a=false,b=false,c=false, d=false;
if(i<len && (str.charAt(i)=='+' || str.charAt(i)=='-')) i++;
while( i<len && isDigit(str.charAt(i)) ){ i++; a=true; }
if(i<len && (str.charAt(i)=='.')) i++;
while( i<len && isDigit(str.charAt(i)) ){ i++; b=true; }
if(i<len && (str.charAt(i)=='e' || str.charAt(i)=='E') && (a || b)){ i++; c=true; }
if(i<len && (str.charAt(i)=='+' || str.charAt(i)=='-') && c) i++;
while( i<len && isDigit(str.charAt(i)) ){ i++; d=true;}
return i==len && (a||b) && (!c || (c && d));
}
static boolean isDigit(char c){
return c>='0' && c<='9';
}
Parallele Prüfung auf muy lange Zeichenfolgen mit IntStream
In Java 8 wird getestet, ob alle Zeichen der angegebenen string
zwischen '0' und '9' liegen. Beachten Sie, dass die leere Zeichenkette akzeptiert wird:
string.chars().unordered().parallel().allMatch( i -> '0' <= i && '9' >= i )
Willkommen bei stackoverflow. Im Allgemeinen ist es am besten zu vermeiden, alte Themen wieder aufleben zu lassen, es sei denn, die Antwort fügt dem Thema etwas wesentlich Neues hinzu. Dieser Ansatz ist zwar gültig, wurde aber bereits in der akzeptierten Antwort erwähnt.
Versuchen Sie dies:
public boolean isNumber(String str)
{
short count = 0;
char chc[] = {'0','1','2','3','4','5','6','7','8','9','.','-','+'};
for (char c : str.toCharArray())
{
for (int i = 0;i < chc.length;i++)
{
if( c == chc[i]){
count++;
}
}
}
if (count != str.length() )
return false;
else
return true;
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
42 Stimmen
Alle Lösungen, die mit regulären Ausdrücken vorgeschlagen werden, funktionieren nicht für hexadezimale Zahlen.
0 Stimmen
Und die Übergabe einer Null-Zeichenkette in der Funktion matches(...) führt zur Ausnahme NullPointer.
0 Stimmen
In der Antwort von Max Malysh finden Sie eine prägnante Java 8-Lösung ohne Bibliotheken von Drittanbietern.
0 Stimmen
@HiteshSahu Null-Strings scheinen in der neuesten Version (einschließlich Java 6.x und 7.x) ordnungsgemäß behandelt zu werden.
0 Stimmen
Alle vorgeschlagenen Lösungen zur Verwendung
Integer.parseInt()
nicht in der Lage, Handynummern zu analysieren, dieNumberFormatException
.0 Stimmen
@OscarCastiblanco Alle Zeichenketten sind Zahlen in einer bestimmten Basis.