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

На основе разбора

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

 function isNormalInteger(str) { var n = Math.floor(Number(str)); return n !== Infinity {amp}amp;{amp}amp; String(n) === str {amp}amp;{amp}amp; n {amp}gt;= 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 {amp}amp;{amp}amp; String(n) === str {amp}amp;{amp}amp; n {amp}gt;= 0; } 

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

 function isNormalInteger(str) { var n = Math.floor(Number(str)); return n !== Infinity {amp}amp;{amp}amp; String(n) === str {amp}amp;{amp}amp; n {amp}gt;= 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 ? " {amp}lt;= OK" : " {amp}lt;= 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 
 {amp}lt;label{amp}gt; String: {amp}lt;input id="text" type="text" value=""{amp}gt; {amp}lt;label{amp}gt; {amp}lt;input id="btn" type="button" value="Check"{amp}gt; 

Тестовый стенд ( с обработкой для ведущих нулей и пробелов):

 function isNormalInteger(str) { str = str.trim(); if (!str) { return false; } str = str.replace(/^0 /, "") || "0"; var n = Math.floor(Number(str)); return String(n) === str {amp}amp;{amp}amp; n {amp}gt;= 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 ? " {amp}lt;= OK" : " {amp}lt;= 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", true); test(" 123 ", true); 
 {amp}lt;label{amp}gt; String: {amp}lt;input id="text" type="text" value=""{amp}gt; {amp}lt;label{amp}gt; {amp}lt;input id="btn" type="button" value="Check"{amp}gt; 

Если вы хотите запретить 0 , просто измените {amp}gt;= 0 на {amp}gt; 0 . (Или в версии, которая допускает начальные нули, удалите || "0" в строке replace .)

Как это работает:

  1. В версии, допускающей пробелы и начальные нули:

    • str = str.trim(); удаляет все начальные и конечные пробелы.
    • if (!str) ловит пустую строку и возвращает, нет смысла делать остальную часть работы.
    • str = str.replace(/^0 /, "") || "0"; удаляет все начальные 0 из строки — но если это приводит к пустой строке, восстанавливает один 0.
  2. Number(str) : преобразовать str в число; число может иметь дробную часть или может быть NaN .

  3. Math.floor : усечь число (отсекает любую дробную часть).

  4. String(...) : преобразовывает результат обратно в обычную десятичную строку. Для действительно больших чисел это пойдет в научную нотацию, которая может нарушить этот подход. (Я не совсем знаю, где находится разделение, детали в спецификации , но для целых чисел, я полагаю, это в тот момент, когда вы превысили 21 цифру [к этому времени число стало очень неточным, как IEEE-754 числа с двойной точностью имеют приблизительно 15 цифр ..)

  5. ... === str : сравнивает это с исходной строкой.

  6. n {amp}gt;= 0 : проверьте, что это положительно.

Обратите внимание, что это не работает для ввода " 1" , любого ввода в научной нотации, который не превращается в ту же научную нотацию на этапе String(...) , и для любого значения, которое использует тип числа, используемого JavaScript ( Двоичная с плавающей запятой IEEE-754 с двойной точностью) не может точно представить, какие синтаксические разборы ближе к значению, отличному от заданного (которое включает в себя множество целых чисел свыше 9 007 199 254 740 992;

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

Другой подход заключается в проверке символов строки с помощью регулярного выражения, если ваша цель состоит в том, чтобы просто разрешить (скажем) дополнительный за которым следует либо 0 либо строка в обычном десятичном формате:

 function isNormalInteger(str) { return /^ ?(0|[1-9]d*)$/.test(str); } 

Живой стенд:

 function isNormalInteger(str) { return /^ ?(0|[1-9]d*)$/.test(str); } 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 ? " {amp}lt;= OK" : " {amp}lt;= 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 
 {amp}lt;label{amp}gt; String: {amp}lt;input id="text" type="text" value=""{amp}gt; {amp}lt;label{amp}gt; {amp}lt;input id="btn" type="button" value="Check"{amp}gt; 

Как это работает:

  1. ^ : Сопоставить начало строки

  2. ? : Разрешить один, необязательный (удалите это, если вы не хотите)

  3. (?:...|...) : разрешить один из этих двух вариантов (без создания группы захвата):

    1. (0|...) : Разрешить 0 самостоятельно …

    2. (...|[1-9]d*) : … или число, начинающееся с чего-то, отличного от 0 и сопровождаемое любым количеством десятичных цифр.

  4. $ : Соответствует концу строки.

Если вы хотите запретить 0 (потому что оно не является положительным), регулярное выражение становится просто /^ ?[1-9]d*$/ (например, мы можем потерять чередование, которое нам нужно, чтобы разрешить 0 ).

Если вы хотите разрешить начальные нули (0123, 00524), просто замените чередование (?:0|[1-9]d*) на d

 function isNormalInteger(str) { return /^ ?d $/.test(str); } 

Если вы хотите разрешить пробел, добавьте s* сразу после ^ и s* непосредственно перед $ .

Обратите внимание на то, когда вы преобразуете это в число: на современных движках, вероятно, было бы хорошо использовать str или Number(str) чтобы сделать это, но более старые могут расширить их нестандартным (но ранее разрешенным) способом, который говорит, что ведущий ноль означает восьмеричное (основание 8), например, «010» ={amp}gt; 8.

После того, как вы проверили число, вы можете безопасно использовать parseInt(str, 10) чтобы убедиться, что оно анализируется как десятичное число (основание 10). parseInt будет игнорировать мусор в конце строки, но мы убедились, что с регулярным выражением их нет.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector