Wie finde ich heraus, ob das erste Zeichen einer Zeichenfolge eine Zahl ist?

108

Gibt es in Java eine Möglichkeit herauszufinden, ob das erste Zeichen einer Zeichenfolge eine Zahl ist?

Ein Weg ist

string.startsWith("1")

und mache das oben genannte bis 9, aber das scheint sehr ineffizient zu sein.

Allgegenwärtig
quelle
10
Ich wollte den Regex-Weg erwähnen, aber ich hatte Angst, dass Sie versucht wären, es zu versuchen, wenn ich es täte.
Michael Myers

Antworten:

259
Character.isDigit(string.charAt(0))

Beachten Sie, dass dies jede Unicode-Ziffer zulässt , nicht nur 0-9. Vielleicht bevorzugen Sie:

char c = string.charAt(0);
isDigit = (c >= '0' && c <= '9');

Oder die langsameren Regex-Lösungen:

s.substring(0, 1).matches("\\d")
// or the equivalent
s.substring(0, 1).matches("[0-9]")

Bei jeder dieser Methoden müssen Sie jedoch zuerst sicherstellen, dass die Zeichenfolge nicht leer ist. Wenn es ist, charAt(0)und substring(0, 1)wird ein werfen StringIndexOutOfBoundsException. startsWithhat dieses Problem nicht.

Um die gesamte Bedingung einzeilig zu machen und Längenprüfungen zu vermeiden, können Sie die regulären Ausdrücke wie folgt ändern:

s.matches("\\d.*")
// or the equivalent
s.matches("[0-9].*")

Wenn die Bedingung in Ihrem Programm nicht in einer engen Schleife angezeigt wird, ist es unwahrscheinlich, dass der geringe Leistungseinbruch bei der Verwendung regulärer Ausdrücke erkennbar ist.

Michael Myers
quelle
Betreff: "Sie müssen zuerst sicherstellen, dass die Zeichenfolge nicht leer ist" - true und darüber hinaus - Sie müssen auch sicherstellen, dass sie nicht null ist, als ob alle angezeigten Methoden Ausnahmen auslösen würden. Sie können entweder direkt überprüfen (zB ((null!=s) && Character.isDigit(s.charAt(0)) )) oder Tricks wieCharacter.isDigit((s?s:"X").charAt(0))
epeleg
8

Reguläre Ausdrücke sind ein sehr starkes, aber teures Werkzeug. Es ist gültig, sie zu verwenden, um zu überprüfen, ob das erste Zeichen eine Ziffer ist, aber es ist nicht so elegant :) Ich bevorzuge diesen Weg:

public boolean isLeadingDigit(final String value){
    final char c = value.charAt(0);
    return (c >= '0' && c <= '9');
}
Kiril Aleksandrov
quelle
12
1) functionist nicht Java. 2) Dies erlaubt nur arabische Ziffern, nicht chinesische, indische usw. Das ist vielleicht das, was Sie bevorzugen, aber es ist nicht in der Frage angegeben. 3) Diese genaue Lösung habe ich bereits vor vier Jahren in meiner Antwort behandelt.
Michael Myers
0
regular expression starts with number->'^[0-9]' 
Pattern pattern = Pattern.compile('^[0-9]');
 Matcher matcher = pattern.matcher(String);

if(matcher.find()){

System.out.println("true");
}
Narayan Yerrabachu
quelle
2
Sie benötigen das {1,1}Suffix nicht, was bedeutet, dass "das vorhergehende Muster zwischen 1 und 1 Mal erscheinen muss". Dies bedeutet genau das gleiche wie das Muster für sich.
Andrzej Doyle
Diese Lösung funktioniert nicht, da String.matches und Pattern API versuchen, die vollständige Zeichenfolge und nicht nur das erste Zeichen abzugleichen
Amrish Pandey
0

Ich bin gerade auf diese Frage gestoßen und habe darüber nachgedacht, mit einer Lösung beizutragen, die keinen regulären Ausdruck verwendet.

In meinem Fall verwende ich eine Hilfsmethode:

public boolean notNumber(String input){
    boolean notNumber = false;
    try {
        // must not start with a number
        @SuppressWarnings("unused")
        double checker = Double.valueOf(input.substring(0,1));
    }
    catch (Exception e) {
        notNumber = true;           
    }
    return notNumber;
}

Wahrscheinlich ein Overkill, aber ich versuche, Regex zu vermeiden, wann immer ich kann.

Pedro HN Vieira
quelle