2009-08-03 8 views
103

W języku Java jest sposób, aby dowiedzieć się, czy pierwszy znak ciągu jest liczbą?Jak mogę się dowiedzieć, czy pierwszy znak ciągu jest liczbą?

Jednym ze sposobów jest

string.startsWith("1") 

i zrobić przede wszystkim drogę do 9, ale to wydaje się bardzo nieefektywne.

+10

miałem zamiar wymienić regex sposób, ale bałem się, że gdybym to zrobił, można byłoby pokusić się spróbować. –

Odpowiedz

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

Należy pamiętać, że this will allow any Unicode digit, a nie tylko 0-9. Może wolisz:

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

Albo wolniejszych regex rozwiązania:

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

jednak z żadnej z tych metod, należy najpierw upewnić się, że łańcuch nie jest pusty. Jeśli tak, to i substring(0, 1) rzucają StringIndexOutOfBoundsException. startsWith nie ma tego problemu.

Aby cały stan jedną linię i uniknąć kontroli długości, można zmieniać regexes do poniższego:

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

Jeśli warunek nie pojawia się w ciasnej pętli w programie, małej przeboju wydajności korzystanie z wyrażeń regularnych prawdopodobnie nie będzie zauważalne.

+0

wow. ludzie uwielbiają Cię wspominać :) dziękuję za odpowiedź. – Omnipresent

+11

Dlaczego nie? Jest poprawny * dwa razy *. :) (Nawiasem mówiąc, zachęcam cię do głosowania więcej, głosowanie jest integralną częścią tej strony.) Widzę, że masz 41 stanowisk, ale tylko 19 głosów w 7 miesięcy.) –

+0

Ha, dam ci pół głosowania za każdym razem, kiedy masz rację. – jjnguy

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 przyrostka' {1,1} ' , co oznacza, że ​​"poprzedni wzór musi pojawić się między 1 a 1 razy". Oznacza to dokładnie to samo, co sam wzór. –

+0

To rozwiązanie nie działa, ponieważ String.matches i Pattern API próbują dopasować kompletny ciąg, a nie tylko pierwszy znak. –

8

Wyrażenia regularne są bardzo mocnym, ale drogim narzędziem. Jest ważne, aby wykorzystać je do sprawdzenia, czy pierwszy znak jest cyfrą, ale to 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'); 
} 
+10

1) 'function' nie jest Javą. 2) To pozwala tylko cyfry arabskie, nie chińskie, indyjskie, itp. To może być to, co lubisz, ale nie jest określone w pytaniu. 3) Omówiłem już to dokładne rozwiązanie w mojej odpowiedzi cztery lata temu. –

0

Właśnie natknąłem się na to pytanie i myślał o przyczynianie się roztworem, dokłada nie używaj regex.

W moim przypadku używam metody pomocnika:

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ć regex kiedy tylko mogę.

0

Spróbuj tego kodu pomoże :)

import java.io.*; 

public class findDigit 
{ 
    public findDigit() 
    { 
      String line = "1Hello"; 
      String firstLetter = String.valueOf(line.charAt(0)); //line had 0 to 5 string index 
      char first = firstLetter.charAt(0); 
      /* 
      if (Character.isLetter(first)) //for alphabets 
      if (Character.isSpaceChar(first)) //for spaces 
      */ 
      if (Character.isDigit(first)) // for Digits 
      { 
       int number = Integer.parseInt(firstLetter); 
       System.out.println("This String has digit at first as: "+number); 
      } 
      else 
      { 
       System.out.println("This String has alphabet at first as: "+firstLetter); 
      } 

    } 

    public static void main(String args[]) 
    { 
     new findDigit(); 
    } 
} 
Powiązane problemy