Hai câu trả lời cho bạn:
Lưu ý rằng trong cả hai trường hợp, tôi đã giải thích "số nguyên dương" để bao gồm 0, mặc dù 0không tích cực. Tôi bao gồm ghi chú nếu bạn muốn không cho phép 0.
Dựa trên phân tích cú pháp
Nếu bạn muốn nó là một chuỗi số nguyên thập phân được chuẩn hóa trên một phạm vi giá trị hợp lý, bạn có thể làm điều này:
function isNormalInteger(str) {
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
hoặc nếu bạn muốn cho phép khoảng trắng và số 0 đứng đầu:
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;
}
Thử nghiệm trực tiếp (không xử lý các số 0 hoặc khoảng trắng hàng đầu):
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">
Thử nghiệm trực tiếp ( với việc xử lý các số 0 và khoảng trắng hàng đầu):
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">
Nếu bạn muốn không cho phép 0, chỉ cần thay đổi >= 0thành > 0. (Hoặc, trong phiên bản cho phép các số 0 đứng đầu, hãy xóa dòng || "0"trên replace.)
Cách thức hoạt động:
Trong phiên bản cho phép khoảng trắng và số 0 đứng đầu:
str = str.trim(); loại bỏ bất kỳ whitepace hàng đầu và dấu.
if (!str) bắt một chuỗi trống và trả về, không có điểm nào trong phần còn lại của công việc.
str = str.replace(/^0+/, "") || "0"; xóa tất cả các số 0 đứng đầu khỏi chuỗi - nhưng nếu điều đó dẫn đến một chuỗi trống, hãy khôi phục một số 0 duy nhất.
Number(str): Chuyển đổi strthành một số; con số có thể có một phần phân số, hoặc có thể NaN.
Math.floor: Cắt bớt số (cắt bỏ bất kỳ phần phân số nào).
String(...): Chuyển đổi kết quả trở lại thành một chuỗi thập phân bình thường. Đối với những con số thực sự lớn, điều này sẽ đi đến ký hiệu khoa học, có thể phá vỡ phương pháp này. (Tôi không biết chắc đâu là sự chia rẽ, các chi tiết trong spec , nhưng đối với toàn bộ số liệu mà tôi tin rằng đó là tại thời điểm bạn đã vượt quá 21 chữ số [bởi thời gian đó số đã trở nên rất không chính xác, như IEEE-754 các số chính xác kép chỉ có 15 chữ số chính xác ..)
... === str: So sánh với chuỗi ban đầu.
n >= 0: Kiểm tra xem nó có tích cực không.
Lưu ý rằng điều này không thành công cho đầu vào "+1", bất kỳ đầu vào nào trong ký hiệu khoa học không quay lại cùng một ký hiệu khoa học ở String(...)giai đoạn và đối với bất kỳ giá trị nào mà loại số JavaScript sử dụng (điểm nổi nhị phân chính xác kép của IEEE-754) không thể biểu thị chính xác phân tích nào gần với một giá trị khác với giá trị đã cho (bao gồm nhiều số nguyên trên 9,007,199,254,740,992; chẳng hạn, 1234567890123456789sẽ thất bại). Cái trước là một sửa chữa dễ dàng, hai cái sau không quá nhiều.
Biểu hiện thông thường
Cách tiếp cận khác là kiểm tra các ký tự của chuỗi thông qua biểu thức chính quy, nếu mục tiêu của bạn là chỉ cho phép (nói) một tùy chọn +theo sau bởi một 0hoặc một chuỗi ở định dạng thập phân bình thường:
function isNormalInteger(str) {
return /^\+?(0|[1-9]\d*)$/.test(str);
}
Thử nghiệm trực tiếp:
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">
Cách thức hoạt động:
^: Khớp bắt đầu chuỗi
\+?: Cho phép một, tùy chọn +(xóa cái này nếu bạn không muốn)
(?:...|...): Cho phép một trong hai tùy chọn này (không tạo nhóm chụp):
(0|...): Cho phép 0tự ...
(...|[1-9]\d*): ... hoặc một số bắt đầu bằng một số khác 0và theo sau là bất kỳ số chữ số thập phân nào.
$: Kết thúc chuỗi kết thúc.
Nếu bạn muốn không cho phép 0(vì nó không tích cực), biểu thức chính quy sẽ trở thành /^\+?[1-9]\d*$/(ví dụ: chúng ta có thể mất đi sự thay thế mà chúng ta cần cho phép 0).
Nếu bạn muốn cho phép các số 0 đứng đầu (0123, 00524), thì chỉ cần thay thế xen kẽ (?:0|[1-9]\d*)bằng\d+
function isNormalInteger(str) {
return /^\+?\d+$/.test(str);
}
Nếu bạn muốn cho phép khoảng trắng, hãy thêm \s*ngay sau ^và \s*ngay trước đó $.
Lưu ý khi bạn chuyển đổi số đó thành số: Trên các động cơ hiện đại, có thể sử dụng +strhoặc Number(str)thực hiện nó là tốt, nhưng những cái cũ hơn có thể mở rộng chúng theo cách không chuẩn (nhưng trước đây được cho phép) có nghĩa là số 0 đứng đầu có nghĩa là bát phân (cơ sở 8), ví dụ "010" => 8. Khi bạn đã xác thực số này, bạn có thể sử dụng một cách an toàn parseInt(str, 10)để đảm bảo rằng nó được phân tích cú pháp dưới dạng thập phân (cơ sở 10). parseIntsẽ bỏ qua rác ở cuối chuỗi, nhưng chúng tôi đảm bảo không có bất kỳ thứ gì với regex.