Come faccio a sapere se il primo carattere di una stringa è un numero?


108

In Java c'è un modo per scoprire se il primo carattere di una stringa è un numero?

Un modo è

string.startsWith("1")

e fai quanto sopra fino alle 9, ma sembra molto inefficiente.


10
Stavo per menzionare il modo regex, ma avevo paura che se lo avessi fatto, saresti stato tentato di provarlo.
Michael Myers

Risposte:


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

Nota che questo consentirà qualsiasi cifra Unicode , non solo 0-9. Potresti preferire:

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

O le soluzioni regex più lente:

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

Tuttavia, con uno di questi metodi, devi prima assicurarti che la stringa non sia vuota. Se lo è, charAt(0)e substring(0, 1)lancerà un file StringIndexOutOfBoundsException. startsWithnon ha questo problema.

Per rendere l'intera condizione una riga ed evitare controlli di lunghezza, puoi modificare le espressioni regolari come segue:

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

Se la condizione non compare in un ciclo ristretto nel programma, è probabile che il piccolo calo di prestazioni per l'utilizzo di espressioni regolari non sia evidente.


Re: "devi prima essere sicuro che la stringa non sia vuota" - vero e anche di più - devi anche assicurarti che non sia nullo come se fosse tutti i metodi visualizzati lanceranno eccezioni. Puoi controllare direttamente (ad esempio ((null!=s) && Character.isDigit(s.charAt(0)) )) o utilizzare trucchi comeCharacter.isDigit((s?s:"X").charAt(0))
epeleg

8

Le espressioni regolari sono uno strumento molto forte ma costoso. È valido usarli per verificare se il primo carattere è una cifra ma non è così elegante :) Preferisco questo modo:

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

12
1) functionnon è Java. 2) Questo consente solo numeri arabi, non cinesi, indiani, ecc. Potrebbe essere quello che preferisci, ma non è specificato nella domanda. 3) Ho già trattato questa soluzione esatta nella mia risposta quattro anni fa.
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
Non è necessario il {1,1}suffisso, il che significa che "il pattern precedente deve apparire tra 1 e 1 volta". Ciò significa esattamente lo stesso che il modello fa da solo.
Andrzej Doyle

Questa soluzione non funziona poiché String.matches e Pattern API cercano di abbinare la stringa completa e non solo il primo carattere
Amrish Pandey

0

Mi sono appena imbattuto in questa domanda e ho pensato di contribuire con una soluzione che non utilizzi regex.

Nel mio caso utilizzo un metodo di supporto:

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

Probabilmente un'esagerazione, ma cerco di evitare le espressioni regolari ogni volta che posso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.