Como posso saber se o primeiro caractere de uma string é um número?

108

Em Java, existe uma maneira de descobrir se o primeiro caractere de uma string é um número?

Uma maneira é

string.startsWith("1")

e fazer tudo acima até as 9, mas isso parece muito ineficiente.

Onipresente
fonte
10
Eu ia mencionar o modo regex, mas temo que, se o fizer, você ficará tentado a experimentá-lo.
Michael Myers

Respostas:

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

Observe que isso permitirá qualquer dígito Unicode , não apenas 0-9. Você pode preferir:

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

Ou as soluções de regex mais lentas:

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

No entanto, com qualquer um desses métodos, você deve primeiro se certificar de que a string não está vazia. Se for, charAt(0)e substring(0, 1)vai lançar um StringIndexOutOfBoundsException. startsWithnão tem esse problema.

Para transformar toda a condição em uma linha e evitar verificações de comprimento, você pode alterar as regexes para o seguinte:

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

Se a condição não aparecer em um loop fechado em seu programa, o pequeno impacto no desempenho pelo uso de expressões regulares provavelmente não será perceptível.

Michael Myers
fonte
Re: "você deve primeiro ter certeza de que a string não está vazia" - verdadeiro e mais do que isso - você também deve certificar-se de que não é nulo, pois todos os métodos exibidos lançarão exceções. Você pode verificar diretamente (por exemplo ((null!=s) && Character.isDigit(s.charAt(0)) )) ou usar truques comoCharacter.isDigit((s?s:"X").charAt(0))
epeleg
8

As expressões regulares são ferramentas muito fortes, mas caras. É válido usá-los para verificar se o primeiro caractere é um dígito, mas não é tão elegante :) Eu prefiro assim:

public boolean isLeadingDigit(final String value){
    final char c = value.charAt(0);
    return (c >= '0' && c <= '9');
}
Kiril Aleksandrov
fonte
12
1) functionnão é Java. 2) Isso permite apenas algarismos arábicos, não chinês, indiano, etc. Isso pode ser o que você prefere, mas não está especificado na pergunta. 3) Já abordei essa solução exata em minha resposta há quatro anos.
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
fonte
2
Você não precisa do {1,1}sufixo, o que significa que "o padrão anterior deve aparecer entre 1 e 1 vezes". Isso significa exatamente o mesmo que o próprio padrão.
Andrzej Doyle
Esta solução não funciona, pois a API String.matches e Pattern tenta combinar a string completa e não apenas o primeiro caractere
Amrish Pandey
0

Acabei de me deparar com essa dúvida e pensei em contribuir com uma solução que não use regex.

No meu caso, uso um método auxiliar:

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

Provavelmente um exagero, mas tento evitar regex sempre que posso.

Pedro HN Vieira
fonte