Подтвердить что ты не робот

Подтвердите, что строка является положительным целым числом

Я бы попросил простейший тест с отказоустойчивостью проверить, что строка в JavaScript является положительным целым числом.

isNaN(str) возвращает true для всех видов нецелых значений, а parseInt(str) возвращает целые числа для строк с плавающей запятой, например "2,5". И я не хочу использовать какой-либо плагин jQuery.

4b9b3361

Ответ 1

Два ответа для вас:

  • На основе анализа

  • Регулярное выражение

Обратите внимание, что в обоих случаях я интерпретировал "положительное целое число", чтобы включить 0, хотя 0 не является положительным. Я включаю заметки, если вы хотите запретить 0.

На основе анализа

Если вы хотите, чтобы это была нормализованная десятичная целочисленная строка в разумном диапазоне значений, вы можете сделать это:

function isNormalInteger(str) {
    var n = Math.floor(Number(str));
    return n !== Infinity && String(n) === str && n >= 0;
}

или если вы хотите разрешить пробелы и начальные нули:

function isNormalInteger(str) {
    str = str.trim();
    if (!str) {
        return false;
    }
    str = str.replace(/^0+/, "") || "0";
    var n = Math.floor(Number(str));
    return n !== Infinity && String(n) === str && n >= 0;
}

Тестовый стенд в реальном времени (без обработки начальных нулей или пробелов):

function isNormalInteger(str) {
    var n = Math.floor(Number(str));
    return n !== Infinity && String(n) === str && n >= 0;
}
function gid(id) {
    return document.getElementById(id);
}
function test(str, expect) {
    var result = isNormalInteger(str);
    console.log(
        str + ": " +
        (result ? "Yes" : "No") +
        (expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")
    );
}
gid("btn").addEventListener(
    "click",
    function() {
        test(gid("text").value);
    },
    false
);
test("1", true);
test("1.23", false);
test("1234567890123", true);
test("1234567890123.1", false);
test("0123", false); // false because we don't handle leading 0s
test(" 123 ", false); // false because we don't handle whitespace
<label>
  String:
  <input id="text" type="text" value="">
<label>
<input id="btn" type="button" value="Check">

Ответ 2

Решение 1

Если мы рассмотрим целое число JavaScript как значение максимального 4294967295 (т.е. Math.pow(2,32)-1), то следующее короткое решение будет отлично работать:

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

Описание:

  • Оператор смены нулевого заполнения выполняет три важные вещи:
    • обрезает десятичную часть
      • 123.45 >>> 0 === 123
    • сдвиг для отрицательных чисел
      • -1 >>> 0 === 4294967295
    • "работает" в диапазоне MAX_INT
      • 1e10 >>> 0 === 1410065408
      • 1e7 >>> 0 === 10000000
  • parseFloat исправляет разбор строк строк (установка NaN для не числовых строк)

ИСПЫТАНИЯ:

"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/


Решение 2

Другой способ хорош для всех числовых значений, которые действительны до Number.MAX_VALUE, то есть примерно 1.7976931348623157e+308:

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

Описание:

  • !isNaN(parseFloat(n)) используется для фильтрации чистых значений строк, например. "", " ", "string";
  • 0 <= ~~n фильтрует отрицательные и большие нецелые значения, например. "-40.1", "129000098131766699";
  • (!isNaN(parseFloat(n)) && 0 <= ~~n) возвращает true, если значение является как числовым, так и положительным;
  • 0 === n % (...) проверяет, является ли значение не-float - здесь (...) (см. 3) оценивается как 0 в случае false и как 1 в случае true.

ИСПЫТАНИЯ:

"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/


Предыдущая версия:

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

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

Ответ 3

Похоже, что регулярное выражение - это путь:

var isInt = /^\+?\d+$/.test('the string');

Ответ 4

Современное решение, которое работает в узлах и в более чем 90% всех браузеров (кроме IE и Opera Mini), заключается в использовании Number.isInteger с последующей простой положительной проверкой.

Number.isInteger(x) && x > 0

Это было завершено в ECMAScript 2015.

function isPositiveInteger(x) {
    return Number.isInteger(x) && x > 0
}

Полифил это:

Number.isInteger = Number.isInteger || function(value) {
  return typeof value === 'number' && 
    isFinite(value) && 
    Math.floor(value) === value;
};

Если вам требуется поддержка ввода, который может быть в форме строки или числа, тогда вы можете использовать эту функцию. Я написал большой набор тестов для после всех существующие ответы (1/2/2018) не сработали при какой-либо форме ввода.

function isPositiveInteger(v) {
  var i;
  return v && (i = parseInt(v)) && i > 0 && (i === v || ''+i === v);
}

Ответ 5

Это почти дублирующий вопрос для этого:

Подтвердить десятичные числа в JavaScript - IsNumeric()

Ответ:

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

поэтому положительное целое число будет:

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

Ответ 6

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

не будет работать, если вы дадите строку типа "0001", хотя

Ответ 7

Моя функция проверяет, имеет ли число + ve и может иметь десятичное значение.

       function validateNumeric(numValue){
            var value = parseFloat(numValue);
            if (!numValue.toString().match(/^[-]?\d*\.?\d*$/)) 
                    return false;
            else if (numValue < 0) {
                return false;
            }
            return true;        
        }

Ответ 8

Как раз для того, чтобы использовать ответ VisioN выше, если вы используете плагин проверки jQuery, вы можете использовать это:

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

Затем вы можете использовать в своих обычных правилах или добавить их динамически следующим образом:

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

Ответ 9

(~~a == a) где a - это строка.

Ответ 10

Просто используйте это

let num = 1.2;
let res;
res = Number.isInteger(num);
console.log(res);

Вы получите результат в true или false.

Если оно будет целочисленным, оно вернет true, иначе вернет false.

Ответ 11

Простой

function isInteger(num) {
  return (num ^ 0) === num;
}

console.log(isInteger(1));

Вы также можете расширить Number и назначить ему функцию через прототип.

Ответ 12

Если вы используете формы HTML5, вы можете использовать атрибут min="0" для элемента формы <input type="number" />. Это поддерживается всеми основными браузерами. Он не включает Javascript для таких простых задач, но интегрирован в новый стандарт html. Он документирован на https://www.w3schools.com/tags/att_input_min.asp

Ответ 13

function myFunction() {
var pattern = new RegExp('^[1-9]\\d*$');
let n = document.getElementById("number").value;
if(pattern.test(n)) {
console.log('${n} is a positive integer');

} else {
  console.log('${n} is not a positive integer');

}
}
<form id="myForm" action="#" onsubmit="myFunction()">
  Enter number: <input type="text" id="number" required><br>
  
  <input type="submit"  value="Submit form">
</form>