Validar si un dato es numérico en Java
Navegando por los diferentes foros de la red me encuentro con la siguiente pregunta. ¿Cómo puedo validar si un dato es numerico en Java? A uno le puede parecer una pregunta muy básica y típica de alguien que ni siquiera se ha leido la documentación, pero la cuestión es que es una duda que existe.
De hecho, la gente busca el método isNumeric(String). Que, a día de hoy, no existe dentro de las APIs de Java, si bien, si que existe en algunas otras librerias de renombre, como puede ser en Apache Commons, en concreto org.apache.commons.lang.StringUtils.isNumeric().
Y es que en muchos casos nos vamos a encontrar con origenes de datos, donde de una forma explicita no vengan definidos como numeros. Esta claro que una base de datos que alberga enteros lleva la validación implicita, que un WebService (o un simple método Java) identificará los campos como numéricos,... Pero que sucede si estamos leyendo un fichero. Este de forma implicita no lleva ninguna validación. Es en este tipo de casos donde será bueno el realizar este tipo de validaciones. (Cierto es que podríamos realizar una lectura directa sobre enteros).
Para poder resolver esta duda la idea es la siguiente. Partimos de las dos siguientes variables:
Ahora tenemos que codificar el método isNumeric(String), el cual podemos utilizar a posteriori para validar las cadenas. Esto lo haremos de la siguiente forma:
String cadenaUno = "1234";
String cadenaDos = "No soy un numero";
if (Comunes.isNumeric(cadenaUno))
System.out.println(cadenaUno + " es un numero");
else
System.out.println(cadenaUno + " NO es un numero");
if (Comunes.isNumeric(cadenaDos))
System.out.println(cadenaDos + " es un numero");
else
System.out.println(cadenaDos + " NO es un numero");
El método isNumeric(string) se apoyará en la clase Integer. La idea consiste en transformar la cadena en un número. En el caso de que resulte bien, es que la cadena es un número (obvio), si falla, es que nuestra cadena no será un número.
isNumeric será un método estático de la clase Comunes. Es por ello que su utilización es la de Comunes.isNumeric(String).
El método de Integer que nos permite transformarlo en numerico es .parseInt(String). Si va bien devuelve el entero, sino genera la excepción NumberFormatException. De esta forma nuestro método quedará de la siguiente forma:
private static boolean isNumeric(String cadena){
try {
Integer.parseInt(cadena);
return true;
} catch (NumberFormatException nfe){
return false;
}
}
Este método es válido para ciertos propositos, pero no tenemos que olvidar que existen números más grandes que deberían de ser tratados con clases como Long o Double. Es decir, que nuestro método isNumeric(String) podría ser un poco más complejo.
Esto es un ejemplo en este caso usando charAt para extraer los caracteres, length para comprobar la longitud e isDigit para comprobar si es un número:
import java.util.Scanner; //Importación del código de la clase Scanner desde la biblioteca Java
//Código de nuestra clase principal ejemplo aprenderaprogramar.com
public class Ejemplo {
public static void main (String [ ] args) {
boolean entradaNumerica = true;
String entradaTeclado ="";
System.out.print ("Introduzca un número de 3 dígitos: ");
Scanner entradaEscaner = new Scanner(System.in);
entradaTeclado = entradaEscaner.nextLine (); //Invocamos un método sobre un objeto Scanner
System.out.println ("Entrada recibida por teclado es: \"" + entradaTeclado +"\" ... análisis de longitud");
if (entradaTeclado.length() != 3) {
System.out.println ("No tiene longitud 3, entrada no válida");
} else { System.out.println ("La longitud es correcta");}
for (int i=0;i< entradaTeclado.length(); i++) {
System.out.print ("Analizando si caracteres son dígitos..." + entradaTeclado.charAt(i));
if (Character.isDigit(entradaTeclado.charAt(i)) == false) {
System.out.println (" ... no es un número, entrada no válida");
entradaNumerica = false;
break;
} else {System.out.println(" ...ok"); }
}
if (entradaNumerica == true) {System.out.println ("Todos los caracteres son números"); }
else {System.out.println ("Hay caracteres no numéricos"); }
System.out.println ("Proceso de análisis terminó");
}
}
Una de las operaciones más comunes cuando se trabaja con datos, es validar si un dato es numérico o no. Existen diferentes formas de hacerlo, una de ellas muy común es utilizar una expresión regular al tratar de realizar un parseInt, parseLong o parseDouble. Sin embargo cuando no necesitamos crear metodos adicionales en nuestras clases, podemos recurrir rapidamente a nuestros mejores amigos para manejo de cadenas : “Las Expresiones Regulares”.
El ejemplo mostrado a continuación presenta otra alternativa para realizar validaciones de números utilizando expresiones regulares, a partir del método maches de la clase String :).
Código
public class ValidarNumero { public static void main(String[] args) { ValidarNumero ejemplo = new ValidarNumero(); // # Realizando validaciones a un numero // Numero con un espacio System.out.println(ejemplo.validar(" 123456")); // Numero con un caracter especial (punto) System.out.println(ejemplo.validar("12.3456")); // Con un caracter especial (coma) System.out.println(ejemplo.validar("10,0001")); // Numero valido System.out.println(ejemplo.validar("3465756")); // Numero con una letra (A) System.out.println(ejemplo.validar("10000A")); // Cadena vacia System.out.println(ejemplo.validar("")); // # Eliminando caracteres no correspondientes a un numero // Numero con un espacio System.out.println(ejemplo.convertir(" 123456")); // Numero con un caracter especial (punto) System.out.println(ejemplo.convertir("12.3456")); // Con un caracter especial (coma) System.out.println(ejemplo.convertir("10,0001")); // Numero valido System.out.println(ejemplo.convertir("3465756")); // Numero con una letra (A) System.out.println(ejemplo.convertir("10000A")); // Cadena vacia System.out.println(ejemplo.convertir("")); } public boolean validar(String cadena) { if (cadena.matches("[0-9]*")) { return true; } else { return false; } } public int convertir(String numero) { // Se reemplazan todos los caracteres que no correspondan a un numero // por espacio numero = numero.replaceAll("[^0-9]", ""); // Si la cadena queda vacia if (numero.equals("")) { numero = "0"; } return Integer.parseInt(numero); } }
Salida
false false false true false true 123456 123456 100001 3465756 10000 0