w3schools tag tab style page for color javascript

tag - JavaScript-Prueba para un entero



title of page html (11)

Tengo un campo de texto que permite a un usuario ingresar su edad. Estoy tratando de hacer alguna validación del lado del cliente en este campo con JavaScript. Tengo la validación del lado del servidor ya en su lugar. Sin embargo, parece que no puedo verificar que el usuario ingrese un número entero real. Actualmente estoy intentando el siguiente código:

function IsValidAge(value) { if (value.length == 0) { return false; } var intValue = parseInt(value); if (intValue == Number.NaN) { return false; } if (intValue <= 0) { return false; } return true; }

Lo curioso es que he ingresado caracteres individuales en el cuadro de texto como "b" y este método devuelve verdadero. ¿Cómo me aseguro de que el usuario solo esté ingresando un número entero?

Gracias


function isInt (x) {return Math.floor (x) === x;}


Encontré que faltaban las respuestas NaN porque no captan los caracteres finales (por lo que "123abc" se considera un número válido), así que intenté convertir la cadena en un entero y volver a una cadena, y asegurar que coincidiera con el original después de la conversión :

if ("" + parseInt(stringVal, 10) == stringVal) { alert("is valid number"); }

Esto funcionó para mí, hasta que los números eran tan grandes que comenzaron a aparecer como notación científica durante la conversión.

... así que, por supuesto, esto significa que puede ingresar un número en notación científica, pero verificar los valores mínimos y máximos también lo evitaría si así lo desea.

Por supuesto, fallará si utiliza separadores (como "1,000" o "1,000" dependiendo de su localidad) - dígitos solo permitidos aquí.


Hice esto para verificar el número y el valor entero

if(isNaN(field_value * 1) || (field_value % 1) != 0 ) not integer; else integer;

División modular

Ejemplo
1. 25.5% 1! = 0 y,
2. 25% 1 == 0

Y si (field_value * 1) NaN if string ej .: 25,34 o abcd, etc. ... else entero o número


Nadie intentó esto tan simple?

function isInt(value) { return value == parseInt(value, 10); }

¿Qué está mal con eso?


Para una comprobación interna real, use esto:

function isInt(value) { return !isNaN(parseInt(value,10)) && (parseFloat(value,10) == parseInt(value,10)); }

El problema con muchas comprobaciones int es que devuelven ''falso'' para 1.0, que es un entero válido. Este método comprueba para asegurarse de que el valor de float y int es igual, por lo que para # .00 devolverá true.

ACTUALIZAR:

Se han discutido dos cuestiones en los comentarios que agregaré a la respuesta para futuros lectores:

  • En primer lugar, al analizar valores de cadena que utilizan una coma para indicar el lugar decimal, este método no funciona. (No es sorprendente, ¿cómo podría? Dado "1,001", por ejemplo, en los Estados Unidos es un número entero, mientras que en Alemania no lo es).
  • En segundo lugar, el comportamiento de parseFloat y parseInt ha cambiado en ciertos navegadores desde que se escribió esta respuesta y varía según el navegador. ParseInt es más agresivo y descarta las letras que aparecen en una cadena. Esto es ideal para obtener un número pero no tan bueno para la validación.

Mi recomendación y práctica para usar una biblioteca como Globalize.js para analizar valores numéricos para / desde la UI en lugar de la implementación del navegador y para usar las llamadas nativas solo para valores conocidos provistos "programáticamente", como una cadena analizada desde un documento XML .


Puede usar el método isInteger() del objeto Number

if ( (new Number(x)).isInteger() ) { // handle integer }

Este método funciona correctamente si x undefined está undefined o es null . Pero tiene un soporte de navegador deficiente por ahora


Si su número está en el rango entero de 32 bits, podría ir con algo como:

function isInt(x) { return ""+(x|0)==""+x; }

El operador a nivel de bit o el operador fuerza la conversión a int 32 bits con signo. La conversión de cadenas en ambos lados garantiza que se cumpla la búsqueda de verdaderas / falsas.


use isNaN (n)

es decir

if(isNaN(intValue))

en lugar de

if (intValue == Number.NaN)


ACTUALIZAR

He corregido el código que tenía un error y agregué una var clave llamada para almacenar el código de tecla presionada usando keyCode y que , eso depende del navegador.

var key = e.which || e.keyCode;

Gracias Donald.McLean :)

Si desea verificar si está escribiendo números mientras escribe (y evita escribir otros caracteres en su campo de entrada), puede usar esta función simple y puede definir los elementos permitidos (esto incluye lo que quiera filtrar). De esta forma, puede elegir no solo enteros sino, por ejemplo, un determinado grupo de caracteres. El ejemplo se basa en jQuery para adjuntarlo a un campo de entrada.

$(''#myInputField'').keypress(function(e) { var key = e.which || e.keyCode; if (!(key >= 48 && key <= 57) && // Interval of values (0-9) (key !== 8) && // Backspace (key !== 9) && // Horizontal tab (key !== 37) && // Percentage (key !== 39) && // Single quotes ('') (key !== 46)) // Dot { e.preventDefault(); return false; } });

Si usa otra clave diferente a la definida, no aparecerá en el campo. Y porque Angular.js se está poniendo fuerte en estos días. esta es la directiva que puede crear para hacer esto en cualquier campo de su aplicación web:

myApp.directive(''integer'', function() { return function (scope, element, attrs) { element.bind(''keydown'', function(e) { var key = e.which || e.keyCode; if (!(key >= 48 && key <= 57) && // Interval (0-9) (key !== 8) && // Backspace (key !== 9) && // Horizontal tab (key !== 37) && // Percentage (key !== 39) && // Single quotes ('') (key !== 46)) // Dot { e.preventDefault(); return false; } }); } });

Pero, ¿qué sucede si desea usar ng-repeat y necesita aplicar esta directiva solo en un cierto número de campos? Bueno, puedes transformar la directiva superior en una preparada para admitir un valor verdadero o falso a fin de poder decidir qué campo se verá afectado por él.

myApp.directive(''rsInteger'', function() { return { restrict: ''A'', link: function (scope, element, attrs) { if (attrs.rsInteger === ''true'') { element.bind(''keydown'', function(e) { var key = e.which || e.keyCode; if (!(key >= 48 && key <= 57) && // Interval (0-9) (key !== 8) && // Backspace (key !== 9) && // Horizontal tab (key !== 37) && // Percentage (key !== 39) && // Single quotes ('') (key !== 46)) // Dot { e.preventDefault(); return false; } }); } } } });

Para utilizar esta nueva directiva solo necesita hacerlo en un tipo de texto de entrada como este, por ejemplo:

<input type="text" rs-integer="true">

Espero que te ayude


If (enteredAge < "1" || enteredAge > "130") ......

Simple y funciona ... hasta que desarrollen la inmortalidad


var intRegex = /^/d+$/; if(intRegex.test(someNumber)) { alert(''I am an int''); ... }

Eso definitivamente fallará si el usuario ingresa algo que no sea un entero no negativo.