poco me encontré con un pedazo de código muy parecido a éste:Convertir una cadena completa en un entero en JavaScript
var nHours = parseInt(txtHours);
if(isNaN(nHours)) // Do something
else // Do something else with the value
El desarrollador que escribió el código estaba bajo la impresión de que nHours
sería o un entero que coincidía exactamente con txtHours
o NaN
. Hay varias cosas mal con esta suposición.
En primer lugar, el desarrollador de la izquierda del argumento radix que significa la entrada de "09"
daría como resultado un valor de 0
en lugar de 9
. Este problema se puede resolver mediante la adición de la raíz de este modo:
var nHours = parseInt(txtHours,10);
if(isNaN(nHours)) // Do something
else // Do something else with the value
A continuación, la entrada de "1.5"
dará lugar a un valor de 1
en lugar de NaN
que no es lo que el desarrollador de esperar ya 1.5
no es un entero. Del mismo modo, un valor de "1a"
dará como resultado un valor de 1
en lugar de NaN
.
Todos estos problemas son algo comprensibles ya que este es uno de los ejemplos más comunes de cómo convertir una cadena a un número entero y la mayoría de los lugares no discuten estos casos.
En cualquier caso, me hizo pensar que no conozco ningún modo integrado para obtener un número entero como este. Hay Number(txtHours)
(o +txtHours
) que se acerca pero acepta números no enteros y tratará null
y ""
como 0 en lugar de NaN
.
Para ayudar a los desarrolladores a cabo proporcioné la siguiente función:
function ConvertToInteger(text)
{
var number = Math.floor(+text);
return text && number == text ? number : NaN;
}
Esto parece cubrir todas las cuestiones antes mencionadas. ¿Alguien sabe de algo malo con esta técnica o tal vez una forma más simple de obtener los mismos resultados?
Posiblemente duplicado [http://stackoverflow.com/questions/131406/what-is-the-best-method-to-convert-to-an-integer-in-javascript](http://stackoverflow.com/questions/131406/what-is-the-best-method-to-convert-to-an-integer-in-javascript) – subosito
'Number (txtHours)' en vez de 'number (txtHours)' –
Además, existe una convención de que los nombres de las funciones de los constructores están en mayúscula y los nombres de las funciones regulares no. Recomiendo seguir esa convención usando un nombre en minúsculas como 'convertToInteger' o' toInteger'. Aparte de eso, la función parece bastante sólida para mí. –