Bagaimana cara mengetahui apakah karakter pertama dari sebuah string adalah angka?

108

Di Java, apakah ada cara untuk mengetahui apakah karakter pertama dari sebuah string adalah angka?

Salah satunya adalah

string.startsWith("1")

dan melakukan semua hal di atas hingga 9, tetapi tampaknya sangat tidak efisien.

Mahahadir
sumber
10
Saya akan menyebutkan cara regex, tetapi saya takut jika saya melakukannya, Anda akan tergoda untuk mencobanya.
Michael Myers

Jawaban:

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

Perhatikan bahwa ini akan mengizinkan digit Unicode apa pun , tidak hanya 0-9. Anda mungkin lebih suka:

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

Atau solusi regex yang lebih lambat:

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

Namun, dengan salah satu metode ini, Anda harus terlebih dahulu memastikan bahwa string tidak kosong. Jika ya, charAt(0)dan substring(0, 1)akan melempar StringIndexOutOfBoundsException. startsWithtidak punya masalah ini.

Untuk membuat seluruh ketentuan satu baris dan menghindari pemeriksaan panjang, Anda dapat mengubah ekspresi reguler sebagai berikut:

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

Jika kondisi tidak muncul dalam loop yang ketat dalam program Anda, performa kecil yang dicapai untuk menggunakan ekspresi reguler kemungkinan tidak akan terlihat.

Michael Myers
sumber
Re: "Anda harus terlebih dahulu memastikan bahwa string tidak kosong" - benar dan lebih dari itu - Anda juga harus memastikan tidak null seolah-olah semua metode yang ditampilkan akan membuang pengecualian. Anda dapat langsung memeriksa (misalnya ((null!=s) && Character.isDigit(s.charAt(0)) )) atau menggunakan trik sepertiCharacter.isDigit((s?s:"X").charAt(0))
epeleg
8

Ekspresi reguler adalah alat yang sangat kuat tetapi mahal. Ini valid untuk digunakan untuk memeriksa apakah karakter pertama adalah digit tetapi tidak begitu elegan :) Saya lebih suka cara ini:

public boolean isLeadingDigit(final String value){
    final char c = value.charAt(0);
    return (c >= '0' && c <= '9');
}
Kiril Aleksandrov
sumber
12
1) functionbukan Java. 2) Ini hanya mengizinkan angka Arab, bukan Cina, India, dll. Itu mungkin yang Anda sukai, tetapi tidak ditentukan dalam pertanyaan. 3) Saya sudah membahas solusi tepat ini dalam jawaban saya empat tahun lalu.
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
sumber
2
Anda tidak memerlukan {1,1}sufiks, yang berarti "pola sebelumnya harus muncul antara 1 dan 1 kali". Ini berarti persis sama dengan pola itu sendiri.
Andrzej Doyle
Solusi ini tidak berfungsi karena String.matches dan Pattern API mencoba mencocokkan string lengkap dan bukan hanya karakter pertama
Amrish Pandey
0

Saya baru saja menemukan pertanyaan ini dan berpikir untuk berkontribusi dengan solusi yang tidak menggunakan regex.

Dalam kasus saya, saya menggunakan metode helper:

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

Mungkin berlebihan, tapi saya mencoba menghindari regex kapan pun saya bisa.

Pedro HN Vieira
sumber