Два ответа для вас:
На основе разбора
Регулярное выражение
Обратите внимание, что в обоих случаях я интерпретировал «положительное целое число» 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">
Тестовый стенд ( с обработкой для ведущих нулей и пробелов):
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 && 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", true);
test(" 123 ", true);
<label>
String:
<input id="text" type="text" value="">
<label>
<input id="btn" type="button" value="Check">
Если вы хотите запретить 0, просто измените >= 0на > 0. (Или, в той версии , что позволяет ведущие нули, удалить || "0"на replaceлинии.)
Как это работает:
В версии, допускающей пробелы и ведущие нули:
str = str.trim(); удаляет все начальные и конечные пробелы.
if (!str) ловит пустую строку и возвращает, нет смысла делать остальную часть работы.
str = str.replace(/^0+/, "") || "0"; удаляет все начальные 0 из строки - но если это приводит к пустой строке, восстанавливает один 0.
Number(str): Преобразовать strв число; число может иметь дробную часть или может быть NaN.
Math.floor: Усечь число (отсекает любую дробную часть).
String(...): Преобразует результат обратно в обычную десятичную строку. Для действительно больших чисел это пойдет в научную нотацию, которая может нарушить этот подход. (Я не совсем знаю, где находится разделение, детали в спецификации , но для целых чисел, я полагаю, это в тот момент, когда вы превысили 21 цифру [к этому времени число стало очень неточным, как IEEE-754 числа с двойной точностью имеют приблизительно 15 цифр ..)
... === str: Сравнивает это с исходной строкой.
n >= 0Проверьте, что это положительно.
Обратите внимание, что это невозможно для ввода "+1", любого ввода в научной нотации, который не превращается обратно в ту же научную нотацию на String(...)стадии, и для любого значения, которое использует тип числа JavaScript (двоичная с плавающей точкой двойной точности IEEE-754) не может точно представить, какие разборы ближе к значению, отличному от заданного (которое включает в себя множество целых чисел свыше 9 007 199 254 740 992; например, 1234567890123456789потерпит неудачу). Первое легко исправить, последние два не так уж и много.
Регулярное выражение
Другой подход заключается в проверке символов строки с помощью регулярного выражения, если ваша цель состоит в том, чтобы просто разрешить (скажем) необязательный параметр, +за которым следует либо 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 ? " <= 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">
Как это работает:
^: Сопоставить начало строки
\+?: Разрешить один, необязательно +(удалите это, если вы не хотите)
(?:...|...)Разрешить один из этих двух вариантов (без создания группы захвата):
(0|...): Разрешить 0самостоятельно ...
(...|[1-9]\d*): ... или число, начинающееся с чего-то отличного от 0и сопровождаемое любым количеством десятичных цифр.
$: Сопоставить конец строки.
Если вы хотите запретить 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" => 8. После того, как вы проверили число, вы можете безопасно использовать его, parseInt(str, 10)чтобы убедиться, что оно проанализировано как десятичное число (основание 10). parseIntбудет игнорировать мусор в конце строки, но мы убедились, что с регулярным выражением их нет.