Jak sprawdzić, czy pierwszy znak w ciągu to liczba?


108

Czy w Javie istnieje sposób sprawdzenia, czy pierwszy znak ciągu jest liczbą?

Jeden sposób

string.startsWith("1")

i wykonuj powyższe czynności aż do 9, ale wydaje się to bardzo nieefektywne.


10
Miałem zamiar wspomnieć o sposobie wyrażenia regularnego, ale bałem się, że jeśli to zrobię, kusi Cię, aby tego spróbować.
Michael Myers

Odpowiedzi:


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

Zauważ, że pozwoli to na dowolną cyfrę Unicode , nie tylko 0-9. Może wolisz:

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

Lub wolniejsze rozwiązania regex:

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

Jednak w przypadku każdej z tych metod należy najpierw upewnić się, że ciąg nie jest pusty. Jeśli tak, charAt(0)i substring(0, 1)wyrzuci StringIndexOutOfBoundsException. startsWithnie ma tego problemu.

Aby uczynić cały warunek jedną linią i uniknąć sprawdzania długości, możesz zmienić wyrażenia regularne na następujące:

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

Jeśli warunek nie pojawia się w ciasnej pętli w twoim programie, niewielki spadek wydajności związany z użyciem wyrażeń regularnych prawdopodobnie nie będzie zauważalny.


Re: "musisz najpierw upewnić się, że łańcuch nie jest pusty" - prawda, a nawet więcej - musisz również upewnić się, że nie jest pusty, tak jakby wszystkie wyświetlane metody rzucały wyjątki. Możesz bezpośrednio sprawdzić (np. ((null!=s) && Character.isDigit(s.charAt(0)) )) Lub użyć sztuczek, takich jakCharacter.isDigit((s?s:"X").charAt(0))
epeleg

8

Wyrażenia regularne to bardzo mocne, ale drogie narzędzie. Można ich używać do sprawdzenia, czy pierwszy znak jest cyfrą, ale nie jest tak elegancki :) Wolę ten sposób:

public boolean isLeadingDigit(final String value){
    final char c = value.charAt(0);
    return (c >= '0' && c <= '9');
}

12
1) functionto nie Java. 2) Dopuszczalne są tylko cyfry arabskie, a nie chińskie, indyjskie itp. To może być to, co wolisz, ale nie jest to określone w pytaniu. 3) Dokładnie to rozwiązanie opisałem już cztery lata temu w mojej odpowiedzi.
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");
}

2
Nie potrzebujesz {1,1}sufiksu, co oznacza, że ​​„poprzedni wzorzec musi pojawić się od 1 do 1 razy”. Oznacza to dokładnie to samo, co sam wzór.
Andrzej Doyle

To rozwiązanie nie działa, ponieważ String.matches i Pattern API próbuje dopasować cały ciąg, a nie tylko pierwszy znak
Amrish Pandey

0

Właśnie natknąłem się na to pytanie i pomyślałem o współtworzeniu rozwiązania, które nie używa wyrażenia regularnego.

W moim przypadku używam metody pomocniczej:

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

Prawdopodobnie przesada, ale staram się unikać wyrażeń regularnych, kiedy tylko mogę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.