Comparaciones de cadenas/enteros de Javascript
Almaceno algunos parámetros del lado del cliente en HTML y luego necesito compararlos como números enteros. Lamentablemente me he encontrado con un error grave que no puedo explicar. El error parece ser que mi JS lee los parámetros como cadenas en lugar de números enteros, lo que hace que mis comparaciones de números enteros fallen.
He generado un pequeño ejemplo del error, que tampoco puedo explicar. Lo siguiente devuelve "verdadero" cuando se ejecuta:
console.log("2" > "10")
Analiza la cadena en un número entero usando parseInt
:
javascript:alert(parseInt("2", 10)>parseInt("10", 10))
Verificar que las cadenas sean números enteros es independiente de comparar si una es mayor o menor que otra. Siempre debe comparar número con número y cadena con cadena, ya que el algoritmo para tratar con tipos mixtos no es fácil de recordar.
'00100' < '1' // true
como ambas son cadenas, solo el primer cero de '00100' se compara con '1' y debido a que su código de caracteres es menor, se evalúa como menor.
Sin embargo:
'00100' < 1 // false
Como el RHS es un número, el LHS se convierte en un número antes de la comparación.
Una verificación de números enteros simple es:
function isInt(n) {
return /^[+-]?\d+$/.test(n);
}
No importa si n es un número o un entero, se convertirá en una cadena antes de la prueba.
Si realmente te importa el rendimiento, entonces:
var isInt = (function() {
var re = /^[+-]?\d+$/;
return function(n) {
return re.test(n);
}
}());
Tenga en cuenta que números como 1.0 devolverán falso. Si también desea contar esos números como números enteros, entonces:
var isInt = (function() {
var re = /^[+-]?\d+$/;
var re2 = /\.0+$/;
return function(n) {
return re.test((''+ n).replace(re2,''));
}
}());
Una vez que se pasa esa prueba, la conversión a número para comparar puede utilizar varios métodos. No me gusta parseInt() porque truncará los flotantes para que parezcan enteros, por lo que todo lo siguiente será "igual":
parseInt(2.9) == parseInt('002',10) == parseInt('2wewe')
etcétera.
Una vez que los números se prueban como números enteros, puede usar el operador unario + para convertirlos en números en la comparación:
if (isInt(a) && isInt(b)) {
if (+a < +b) {
// a and b are integers and a is less than b
}
}
Otros métodos son:
Number(a); // liked by some because it's clear what is happening
a * 1 // Not really obvious but it works, I don't like it