คำตอบสองข้อสำหรับคุณ:
โปรดทราบว่าในทั้งสองกรณีฉันได้ตีความ "จำนวนเต็มบวก" ให้รวม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;
}
Live testbed (โดยไม่ต้องจัดการกับศูนย์หรือช่องว่างชั้นนำ):
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">
Live testbed ( พร้อมการจัดการสำหรับศูนย์นำหน้าและช่องว่าง):
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(); ลบ whitepace ที่นำหน้าและต่อท้าย
if (!str) จับสตริงว่างและส่งคืนไม่มีจุดในการทำงานที่เหลือ
str = str.replace(/^0+/, "") || "0"; ลบ 0s นำหน้าทั้งหมดออกจากสตริง - แต่หากผลลัพธ์นั้นเป็นสตริงว่างให้เรียกคืน 0 เดียว
Number(str): แปลงstrเป็นตัวเลข; จำนวนอาจมีส่วนที่เป็นเศษส่วนหรืออาจเป็นNaNได้
Math.floor: ตัดทอนตัวเลข (ตัดส่วนที่เป็นเศษส่วนออก)
String(...): แปลงผลลัพธ์กลับเป็นสตริงทศนิยมปกติ สำหรับตัวเลขจำนวนมากสิ่งนี้จะเป็นสัญกรณ์ทางวิทยาศาสตร์ซึ่งอาจทำให้วิธีการนี้แตก (ฉันไม่รู้ว่าตัวแยกอยู่ตรงไหนรายละเอียดอยู่ในสเป็คแต่สำหรับตัวเลขทั้งหมดฉันเชื่อว่ามันอยู่ที่จุดที่คุณได้เกิน 21 หลัก [ตามเวลาที่จำนวนกลายเป็นไม่แน่นอนมากเช่น IEEE-754 ตัวเลขที่มีความแม่นยำสองเท่ามีความแม่นยำ 15 หลักเท่านั้น .. )
... === str: เปรียบเทียบกับสตริงเดิม
n >= 0: ตรวจสอบว่าเป็นบวก
โปรดทราบว่าสิ่งนี้ล้มเหลวสำหรับอินพุตอินพุต"+1"ใด ๆ ในสัญกรณ์วิทยาศาสตร์ที่ไม่เปลี่ยนกลับไปเป็นสัญกรณ์ทางวิทยาศาสตร์แบบเดียวกันที่String(...)เวทีและสำหรับค่าใด ๆ ที่จาวาสคริปต์แบบตัวเลขใช้ (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จะไม่สนใจขยะในตอนท้ายของสตริง แต่เรามั่นใจว่าไม่มี regex