[Javascript] Valide que una cadena es un entero positivo


Answers

Solución 1

Si consider un entero de JavaScript tiene un valor máximo de 4294967295 (es decir, Math.pow(2,32)-1 ), entonces la siguiente solución breve funcionará perfectamente:

function isPositiveInteger(n) {
    return n >>> 0 === parseFloat(n);
}

DESCRIPCIÓN:

  1. Zero-fill right shift operator hace tres cosas importantes:
    • trunca la parte decimal
      • 123.45 >>> 0 === 123
    • hace el cambio para los números negativos
      • -1 >>> 0 === 4294967295
    • "funciona" en el rango de MAX_INT
      • 1e10 >>> 0 === 1410065408
      • 1e7 >>> 0 === 10000000
  2. parseFloat corrige el análisis sintáctico de los números de cadena (configurando NaN para cadenas no numéricas)

PRUEBAS:

"0"                     : true
"23"                    : true
"-10"                   : false
"10.30"                 : false
"-40.1"                 : false
"string"                : false
"1234567890"            : true
"129000098131766699.1"  : false
"-1e7"                  : false
"1e7"                   : true
"1e10"                  : false
"1edf"                  : false
" "                     : false
""                      : false

DEMO: http://jsfiddle.net/5UCy4/37/

Solución 2

Otra forma es válida para todos los valores numéricos que son válidos hasta Number.MAX_VALUE , es decir, a aproximadamente 1.7976931348623157e+308 :

function isPositiveInteger(n) {
    return 0 === n % (!isNaN(parseFloat(n)) && 0 <= ~~n);
}

DESCRIPCIÓN:

  1. !isNaN(parseFloat(n)) se utiliza para filtrar valores de cadena puros , por ejemplo, "" , " " , "string" ;
  2. 0 <= ~~n filtra valores negativos y no enteros, por ejemplo "-40.1" , "129000098131766699" ;
  3. (!isNaN(parseFloat(n)) && 0 <= ~~n) devuelve true si el valor es tanto numérico como positivo ;
  4. 0 === n % (...) comprueba si el valor es no flotante - aquí (...) (ver 3) se evalúa como 0 en caso de false y como 1 en caso de true .

PRUEBAS:

"0"                     : true
"23"                    : true
"-10"                   : false
"10.30"                 : false
"-40.1"                 : false
"string"                : false
"1234567890"            : true
"129000098131766699.1"  : false
"-1e10"                 : false
"1e10"                  : true
"1edf"                  : false
" "                     : false
""                      : false

DEMO: http://jsfiddle.net/5UCy4/14/

La versión anterior:

function isPositiveInteger(n) {
    return n == "0" || ((n | 0) > 0 && n % 1 == 0);
}

DEMO: http://jsfiddle.net/5UCy4/2/

Question

Me gustaría que la prueba a prueba de fallas más simple verifique que una cadena en JavaScript sea un entero positivo.

isNaN(str) devuelve true para todo tipo de valores no enteros y parseInt(str) devuelve enteros para cadenas flotantes, como "2.5". Y no quiero tener que usar un plugin jQuery tampoco.




Si está utilizando formularios HTML5, puede usar el atributo min="0" para el elemento de formulario <input type="number" /> . Esto es compatible con todos los principales navegadores. No implica Javascript para tareas tan simples, pero está integrado en el nuevo estándar html. Está documentado en https://www.w3schools.com/tags/att_input_min.asp




Solo para aprovechar la respuesta de VisioN anterior, si está utilizando el complemento de validación de jQuery, puede usar esto:

$(document).ready(function() {
    $.validator.addMethod('integer', function(value, element, param) {
        return (value >>> 0 === parseFloat(value) && value > 0);
    }, 'Please enter a non zero integer value!');
}

Luego, puede usar en su conjunto de reglas normales o agregarlo dinámicamente de esta manera:

$("#positiveIntegerField").rules("add", {required:true, integer:true});



Esta es casi una pregunta duplicada para este:

Validar números decimales en JavaScript - IsNumeric ()

Su respuesta es:

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

Entonces, un entero positivo sería:

function isPositiveInteger(n) {
  var floatN = parseFloat(n);
  return !isNaN(floatN) && isFinite(n) && floatN > 0
      && floatN % 1 == 0;
}



return ((parseInt(str, 10).toString() == str) && str.indexOf('-') === -1);

no funcionará si le das una cadena como '0001'