2010-12-28 13 views
6

¿Cómo puedo verificar si un texto ingresado en un cuadro de texto es un número entero o no? Usé la función NAN pero también acepta valores decimales.comprobando si el valor de un campo de texto es entero en javascript

¿Cómo puedo hacer esto? ¿Hay algún método incorporado?

+0

Solo indicando que [* Number.isInteger *] (http: // ecma-interna tional.org/ecma-262/6.0/index.html#sec-isinteger) se agregó en ECMA-262 ed 6 también conocido como ECMAScript 2015. – RobG

Respuesta

16

Digamos que el campo de texto es referenciado por la variable intfield, a continuación, se puede comprobar de esta manera:

var value = Number(intfield.value); 
if (Math.floor(value) == value) { 
    // value is an integer, do something based on that 
} else { 
    // value is not an integer, show some validation error 
} 
+0

Esto tratará las cadenas vacías, o aquellas que contengan solo espacios en blanco, como enteros válidos. Si * intfield.value * es "" (cadena vacía), entonces 'Number (" ")' devuelve 0 y 'Math.floor (value) == value' devuelve true. También devuelve true si * value * se deja como una cadena vacía. – RobG

0
var num = document.getElementById("myField").value; 
if(/^\d+$/.test(num)) { 
    // is an int 
} 
+0

No puede hacer coincidir una expresión regular con un número. –

+0

Acabo de deshacerme del parseInt, me di cuenta de que estaba mal. Gracias Brian. – karim79

+0

Números enteros negativos no manejados – mplungjan

1

Las expresiones regulares serían una manera:

var re = /^-?\d\d*$/ 
alert(re.test(strNumber)); // leading or trailing spaces are also invalid here 

Ejemplo completo con actualizaciones:

http://rgagnon.com/jsdetails/js-0063.html

function validateInteger(strValue) { 
/************************************************ 
DESCRIPTION: Validates that a string contains only 
    valid integer number. 

PARAMETERS: 
    strValue - String to be tested for validity 

RETURNS: 
    True if valid, otherwise false. 
**************************************************/ 
    var objRegExp = /(^-?\d\d*$)/; 

    //check for integer characters 
    return objRegExp.test(strValue); 
} 

Actualización para manejar los espacios en blanco - lo que posiblemente no está permitido en la validación pero aquí está de todos modos: posible continuar a utilizar el código de la enlace que he dado (leftTrim/rightTrim) pero aquí reutilización de recortar .trim() in JavaScript not working in IE

function ignoreLeadingAndtrailingWhitespace(strValue) { 
    return strValue.length>0?validateInteger(strValue.trim()):false; 
} 

if(typeof String.prototype.trim !== 'function') { 
    String.prototype.trim = function() { 
    return this.replace(/^\s+|\s+$/g, ''); 
    } 
} 


function validateInteger(strValue) { 
/************************************************ 
DESCRIPTION: Validates that a string contains only 
    valid integer number. 

PARAMETERS: 
    strValue - String to be tested for validity 

RETURNS: 
    True if valid, otherwise false. 
**************************************************/ 
    var objRegExp = /(^-?\d\d*$)/; 

    //check for integer characters 
    return objRegExp.test(strValue); 
} 
+0

Tiene un grupo de captura innecesario, que no importa demasiado ya que solo está usando 'test', pero sigue siendo extraño. Además, no tiene en cuenta los espacios en blanco al principio o al final. –

+0

dile eso a Gagnon;) Yo solo soy el mensajero aquí, pero punto: actualización en su camino – mplungjan

+1

Actualizado, sin embargo, podría ser que los espacios en blanco iniciales y finales se consideren inválidos en una validación solo para enteros – mplungjan

0

Los datos del formulario es siempre el texto. Mi sugerencia es que analizarlo como entero y compararlo con el original:

var sampleData = ["not a number", "0", "10", "3.14", "-12", "-0.34", "2e10", "34foo", "foo34"]; 
var integers = [], notIntegers = []; 
for(var i=0, len=sampleData.length; i<len; i++){ 
    var original = sampleData[i]; 
    var parsed = parseInt(original, 10); 
    if(!isNaN(parsed) && original==parsed){ 
     integers.push(parsed); 
    }else{ 
     notIntegers.push(original); 
    } 
} 
alert("Integers: " + integers.join(", ") + "\nNot integers: " + notIntegers.join(", ")); 

Esto demuestra:

Integers: 0, 10, -12 
Not integers: not a number, 3.14, -0.34, 2e10, 34foo, foo34 

La notación científica no es compatible, ni los separadores de miles. Si es un problema, necesita algo diferente;)

Actualización: Quiero dejar en claro que este es solo uno de los enfoques posibles, no la única Verdad. Este enfoque tiene sentido si necesita hacer cálculos matemáticos con los datos, de modo que debe obtener una variable numérica de todos modos.

+0

llamo overkill comparado a/^ -? \ d \ d * $/y ¿dónde está tu función? – mplungjan

+0

Por supuesto, dos líneas son exageradas en comparación con una línea porque es exactamente el doble que el código. Me avergüenza. (¿Realmente necesitas ayuda para encapsular esto en una función?) –

0

Si está buscando ya sea por entero o decimal se puede ir a:

function IsNumeric(input) 
{ 
    return (input - 0) == input && input.length > 0; 
} 
1
// validate if the input is numeric and between min and max digits 
function validateNumberSize(inputtxt, min, max) 
{ 
    var numbers = /^[0-9]+$/; 
    if(inputtxt.match(numbers)) 
    { 
     if(inputtxt.length >= min && inputtxt.length <= max) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
0

Es mejor usar la expresión regular de la siguiente manera:

function isInteger(str) { 
    var r = /^-?[0-9]*[1-9][0-9]*$/; 
    return r.test(str); 
} 

Sólo una demostración de prueba:

> function isInteger(str) { 
...  var r = /^-?[0-9]*[1-9][0-9]*$/; 
...  return r.test(str); 
... } 
> isInteger("-123") 
true 
> isInteger("a123") 
false 
> isInteger("123.4") 
false 
Cuestiones relacionadas