¿Cómo averiguo si el primer carácter de una cadena es un número?

108

En Java, ¿hay alguna forma de averiguar si el primer carácter de una cadena es un número?

Una forma es

string.startsWith("1")

y haz lo anterior hasta las 9, pero eso parece muy ineficiente.

Omnipresente
fuente
10
Iba a mencionar la forma de expresión regular, pero temía que si lo hacía, estarías tentado a intentarlo.
Michael Myers

Respuestas:

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

Tenga en cuenta que esto permitirá cualquier dígito Unicode , no solo 0-9. Quizás prefieras:

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

O las soluciones de expresiones regulares más lentas:

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

Sin embargo, con cualquiera de estos métodos, primero debe asegurarse de que la cadena no esté vacía. Si lo es, charAt(0)y substring(0, 1)va a lanzar una StringIndexOutOfBoundsException. startsWithno tiene este problema.

Para hacer que toda la condición sea una línea y evitar verificaciones de longitud, puede modificar las expresiones regulares a lo siguiente:

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

Si la condición no aparece en un bucle cerrado en su programa, es probable que no se note el pequeño impacto en el rendimiento por usar expresiones regulares.

Michael Myers
fuente
Re: "primero debe asegurarse de que la cadena no esté vacía" - verdadero y más que eso - también debe asegurarse de que no sea nulo, ya que si todos los métodos mostrados arrojarían excepciones. Puede verificar directamente (por ejemplo ((null!=s) && Character.isDigit(s.charAt(0)) )) o usar trucos comoCharacter.isDigit((s?s:"X").charAt(0))
epeleg
8

Las expresiones regulares son una herramienta muy fuerte pero cara. Es válido usarlos para comprobar si el primer carácter es un dígito pero no es tan elegante :) Prefiero así:

public boolean isLeadingDigit(final String value){
    final char c = value.charAt(0);
    return (c >= '0' && c <= '9');
}
Kiril Aleksandrov
fuente
12
1) functionno es Java. 2) Esto solo permite números arábigos, no chinos, indios, etc. Puede que sea lo que prefiera, pero no se especifica en la pregunta. 3) Ya cubrí esta solución exacta en mi respuesta hace cuatro años.
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
fuente
2
No necesita el {1,1}sufijo, lo que significa que "el patrón anterior debe aparecer entre 1 y 1 veces". Esto significa exactamente lo mismo que el patrón por sí solo.
Andrzej Doyle
Esta solución no funciona ya que String.matches y Pattern API intentan hacer coincidir la cadena completa y no solo el primer carácter
Amrish Pandey
0

Me encontré con esta pregunta y pensé en contribuir con una solución que no usa expresiones regulares.

En mi caso utilizo un 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;
}

Probablemente una exageración, pero trato de evitar las expresiones regulares siempre que puedo.

Pedro HN Vieira
fuente