Dua jawaban untuk Anda:
Berdasarkan parsing
Ekspresi reguler
Perhatikan bahwa dalam kedua kasus, saya telah menafsirkan "bilangan bulat positif" untuk disertakan 0, meskipun 0tidak positif. Saya menyertakan catatan jika Anda ingin melarang 0.
Berdasarkan Parsing
Jika Anda menginginkannya menjadi string integer desimal yang dinormalisasi pada rentang nilai yang wajar, Anda dapat melakukan ini:
function isNormalInteger(str) {
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
atau jika Anda ingin membolehkan spasi putih dan memimpin nol:
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;
}
Testbed langsung (tanpa menangani angka nol atau spasi kosong):
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">
Testbed langsung ( dengan penanganan untuk memimpin nol dan spasi putih):
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">
Jika Anda ingin melarang 0, ubah saja >= 0ke > 0. (Atau, dalam versi yang memungkinkan angka nol di depan, hapus angka || "0"di replacetelepon.)
Cara kerjanya:
Dalam versi yang memungkinkan spasi dan nol terkemuka:
str = str.trim(); menghapus whitepace terkemuka dan tertinggal.
if (!str) menangkap string kosong dan kembali, tidak ada gunanya melakukan sisa pekerjaan.
str = str.replace(/^0+/, "") || "0"; menghapus semua 0 terkemuka dari string - tetapi jika itu menghasilkan string kosong, mengembalikan satu 0.
Number(str): Konversi strke angka; jumlahnya mungkin memiliki porsi fraksional, atau mungkin NaN.
Math.floor: Pangkas angkanya (memotong bagian pecahan).
String(...): Mengubah hasil kembali menjadi string desimal normal. Untuk jumlah yang sangat besar, ini akan masuk ke notasi ilmiah, yang mungkin mematahkan pendekatan ini. (Saya tidak tahu di mana perpecahan itu, detailnya ada dalam spesifikasi , tetapi untuk bilangan bulat, saya yakin itu pada titik Anda telah melampaui 21 digit [saat itu jumlahnya menjadi sangat tidak tepat, seperti IEEE-754 angka presisi ganda hanya memiliki presisi 15 digit ..)
... === str: Membandingkannya dengan string asli.
n >= 0: Periksa apakah itu positif.
Perhatikan bahwa ini gagal untuk input "+1", input apa pun dalam notasi ilmiah yang tidak berubah menjadi notasi ilmiah yang sama di atas String(...)panggung, dan untuk nilai apa pun yang digunakan oleh nomor jenis JavaScript (IEEE-754 floating point biner presisi ganda) tidak dapat secara akurat menunjukkan parses mana yang lebih dekat ke nilai yang berbeda dari yang diberikan (yang mencakup banyak bilangan bulat lebih dari 9.007.199.254.740.992; misalnya, 1234567890123456789akan gagal). Yang pertama adalah perbaikan yang mudah, dua yang terakhir tidak begitu banyak.
Ekspresi Reguler
Pendekatan lain adalah untuk menguji karakter string melalui ekspresi reguler, jika tujuan Anda hanya mengizinkan (katakanlah) sebuah opsi +diikuti oleh salah satu 0atau string dalam format desimal normal:
function isNormalInteger(str) {
return /^\+?(0|[1-9]\d*)$/.test(str);
}
Testbed langsung:
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">
Cara kerjanya:
^: Cocokkan mulai dari string
\+?: Izinkan satu, opsional +(hapus ini jika Anda tidak mau)
(?:...|...): Izinkan salah satu dari dua opsi ini (tanpa membuat grup tangkap):
(0|...): Izinkan 0sendiri ...
(...|[1-9]\d*): ... atau angka yang dimulai dengan sesuatu selain 0dan diikuti oleh sejumlah angka desimal.
$: Cocokkan ujung string.
Jika Anda ingin melarang 0(karena itu tidak positif), ekspresi reguler menjadi adil /^\+?[1-9]\d*$/(misalnya, kita dapat kehilangan pergantian yang perlu kami izinkan 0).
Jika Anda ingin membolehkan angka nol di depan (0123, 00524), maka ganti saja alternasinya (?:0|[1-9]\d*)dengan\d+
function isNormalInteger(str) {
return /^\+?\d+$/.test(str);
}
Jika Anda ingin membolehkan spasi putih, tambahkan \s*setelah ^dan \s*sebelum $.
Catatan untuk ketika Anda mengonversikannya menjadi angka: Pada mesin modern mungkin akan baik untuk digunakan +stratau Number(str)melakukannya, tetapi yang lebih tua mungkin memperpanjangnya dengan cara yang tidak standar (tetapi sebelumnya diizinkan) yang mengatakan nol di depan berarti oktal (basis 8), mis. "010" => 8. Setelah Anda memvalidasi angka, Anda dapat menggunakan dengan aman parseInt(str, 10)untuk memastikan bahwa itu diuraikan sebagai desimal (basis 10). parseIntakan mengabaikan sampah di akhir string, tetapi kami telah memastikan tidak ada dengan regex.