1055 Stimmen

Wie prüft man in Java, ob ein String numerisch ist?

Wie würden Sie prüfen, ob ein String eine Zahl ist, bevor Sie ihn parsen?

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.

1voto

mikeyreilly Punkte 5743

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;
}

1voto

user3870075 Punkte 145

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';
}

1 Stimmen

Anstelle dieser vielen Prüfungen können wir einfach if (ch >= '0' && ch <= '9') {}

1voto

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 )

1voto

Dayanand Punkte 11

Sie könnten verwenden BigDecimal wenn die Zeichenkette Dezimalzahlen enthalten kann:

try {
    new java.math.BigInteger(testString);
} catch(NumberFormatException e) {
    throw new RuntimeException("Not a valid number");
}

6 Stimmen

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.

0 Stimmen

Es würde ein Sonar-Problem verursachen, wenn Sie die Ausnahme nicht protokollieren.

1voto

Hans van Kraaij Punkte 11

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.com

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.

Powered by:

X