Дві відповіді для вас:
На основі розбору
Регулярне вираження
Зауважте, що в обох випадках я інтерпретував "додатне ціле число", щоб включати 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буде ігнорувати сміття в кінці рядка, але ми переконалися, що цього немає.