Bir dizenin ilk karakterinin sayı olup olmadığını nasıl anlarım?


108

Java'da bir dizenin ilk karakterinin sayı olup olmadığını öğrenmenin bir yolu var mı?

Tek yol

string.startsWith("1")

ve yukarıdakileri 9'a kadar yapın, ancak bu çok verimsiz görünüyor.


10
Regex yönteminden bahsedecektim, ama yaparsam, denemek için cazip olacağından korkuyordum.
Michael Myers

Yanıtlar:


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

Bunun yalnızca 0-9'a değil, herhangi bir Unicode rakamına izin vereceğini unutmayın . Şunları tercih edebilirsiniz:

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

Veya daha yavaş normal ifade çözümleri:

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

Bununla birlikte, bu yöntemlerden herhangi biriyle, önce dizenin boş olmadığından emin olmalısınız. Eğer öyleyse charAt(0)ve substring(0, 1)bir StringIndexOutOfBoundsException. startsWithbu sorunu yok.

Tüm koşulu tek satır yapmak ve uzunluk kontrollerinden kaçınmak için normal ifadeleri aşağıdaki şekilde değiştirebilirsiniz:

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

Koşul, programınızda sıkı bir döngüde görünmüyorsa, normal ifadeleri kullanmak için küçük performans darbesi muhtemelen fark edilmez.


Ynt: "Önce dizenin boş olmadığından emin olmalısınız" - true ve daha fazlası - ayrıca, gösterilen tüm yöntemler istisnalar atacakmış gibi boş olmadığından da emin olmalısınız. Doğrudan kontrol edebilir (örn. ((null!=s) && Character.isDigit(s.charAt(0)) )) Veya aşağıdaki gibi hileler kullanabilirsinizCharacter.isDigit((s?s:"X").charAt(0))
epeleg

8

Normal ifadeler çok güçlü ama pahalı bir araçtır. İlk karakterin rakam olup olmadığını kontrol etmek için kullanmak geçerli ama çok şık değil :) Bu şekilde tercih ediyorum:

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

12
1) functionJava değildir. 2) Bu sadece Arap rakamlarına izin verir, Çince, Hintçe vb. Değil. Tercih ettiğiniz şey bu olabilir, ancak soruda belirtilmemiştir. 3) Bu kesin çözümü dört yıl önceki cevabımda zaten ele almıştım.
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
Son {1,1}eke ihtiyacınız yoktur, yani "önceki kalıp 1 ile 1 kez görünmelidir" anlamına gelir. Bu, modelin kendi başına yaptığı ile tamamen aynı anlamına gelir.
Andrzej Doyle

String.matches ve Pattern API yalnızca ilk karakteri değil tam dizeyi eşleştirmeye çalıştığı için bu çözüm çalışmıyor
Amrish Pandey

0

Az önce bu soruyla karşılaştım ve regex kullanmayan bir çözümle katkıda bulunmayı düşündüm.

Benim durumumda yardımcı bir yöntem kullanıyorum:

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

Muhtemelen aşırılık ama elimden geldiğince normal ifadeden kaçınmaya çalışıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.