Explicaciones de los problemas del uso de parseInt para validar números enteros. En muchos casos puede dar lugar a situaciones confusas. Te ofrecemos un par de funciones de validación de enteros más adecuadas.
La utilización del parseInt para validar números en muchos casos no resulta ser la solución más efectiva, debido a que permite la presencia de letras y/o espacios, y el resultado podría no ser el esperado.
¿Por qué parseInt puede causar problemas?
Esta pregunta se responde a sí misma viendo varios ejemplos sobre el funcionamiento de parseInt:
- "123456": este String retorna como resultado el número 123456 el cual es el resultado esperado.
- "123456asd": este String retorna como resultado el número 123456 a pesar de que el String contenía letras (¿ventaja o desventaja?).
- "asd": este String retorna como resultado NaN el cual es el resultado esperado.
- "": este String vacío retorna como resultado NaN el cual es el resultado esperado.
- " 123456asd": este String (que contiene varios espacios al principio del número y letras al final) retorna como resultado el número 123456 (¿ventaja o desventaja?).
- " 123 123 asd" este String (que contiene espacios y letras) retorna como resultado el número 123 (¿ventaja o desventaja?).
Resumen del comportamiento de la función parseInt
Como se puede observar de los ejemplso anteriores, parseInt
presenta un resultado a veces un poco caprichoso. Vamos a resumir a continuación el comportamiento, para dejar las cosas un poco más claras
Retornará un número válido si:
- El String empieza por un número.
- El String empieza por espacio(s) seguido de un número.
En este caso tenemos varios ejemplos de números válidos:
- "123456"
- " 123456"
- "12345asdasd"
- " 12345 asdd"
Todo String que cumpla con las 2 reglas anteriores (ser un número válido), será truncado cuando se encuentre una letra, espacio o caracteres especiales (comas, acentos,...) dentro del String.
Como resultado, retornará los dígitos que estén más a la izquierda de la primera letra (espacio o caracter) encontrada. Ejemplos de números válidos truncados:
- "123456" retorna como resultado 123456
- " 123456" retorna como resultado 123456
- "12345asdasd" retorna como resultado 12345
- " 123.. asdd" retorna como resultado 123
Alternativa a la validación de enteros sin usar parseInt
Una alternativa al parseInt, que valida que los String contengan solo números la tenemos a continuación:
function validarNumero(c_numero) {
// Verifica si la cadena está vacía
if (c_numero.length === 0) {
return NaN; // Retorna NaN para indicar que no es un número
} else {
// Recorre cada carácter de la cadena para verificar si todos son dígitos
for (let i = 0; i < c_numero.length; i++) {
if (!(c_numero.charAt(i) >= "0" && c_numero.charAt(i) <= "9")) {
return NaN; // Retorna NaN si encuentra un carácter que no es un dígito
}
}
return Number(c_numero); // Retorna el número si todos los caracteres son dígitos
}
}
Y ahora, por si te gusta más, te paso esta misma función pero mejorada haciendo uso de expresiones regulares, que crean un código más compacto para las comprobaciones.
function validarNumero(c_numero) {
if (c_numero.length === 0) {
return NaN; // Retorna el valor especial NaN
} else {
// Utiliza expresión regular para verificar si la cadena contiene solo dígitos
if (!c_numero.match(/^[0-9]+$/)) {
return NaN; // Retorna el valor especial NaN si contiene caracteres no numéricos
}
return Number(c_numero); // Retorna el número si la cadena contiene solo dígitos
}
}
José Antonio Jiménez Garelli