ตรวจสอบว่าสตริงมีตัวเลขเท่านั้น


324

ฉันต้องการตรวจสอบว่าstringมีเพียงตัวเลขเท่านั้น ฉันใช้สิ่งนี้:

var isANumber = isNaN(theValue) === false;

if (isANumber){
    ..
}

แต่รู้ว่ามันยังช่วยให้และ+ -โดยพื้นฐานแล้วฉันต้องการให้แน่ใจว่าinputมีเพียงตัวเลขเท่านั้นและไม่มีอักขระอื่น ๆ เนื่องจาก+100และ-5เป็นตัวเลขทั้งคู่isNaN()จึงไม่ใช่วิธีที่ถูกต้อง บางที regexp เป็นสิ่งที่ฉันต้องการ? เคล็ดลับใด ๆ

คำตอบ:


644

เกี่ยวกับ

var isnum = /^\d+$/.test(val);

1
มันเยี่ยมมาก! ฉันอยากรู้ว่า \ d ไม่อ้างถึงตัวเลขที่เป็นทศนิยมหรือไม่
dewwwald

5
@dewwwald: บางภาษาใช้มันแตกต่างกัน แต่ใน JavaScript, \dคือว่า[0-9]เทียบเท่ากับ
Ry-

ที่นี่ คุณสามารถหาเอกสารเกี่ยวกับวิธีRegular Expressionsการทำงาน
Danfoa

6
/^\d*$/แทนถ้าคุณพบสตริงที่ว่างเปล่าที่มีตัวเลขเท่านั้น
КонстантинВан

@DrorBar ฉันขอโทษสำหรับภาษาอังกฤษที่ไม่ดีของฉันและให้ฉันใช้ถ้อยคำใหม่:“ ถ้าคุณคิดว่าสตริงว่างจะมีตัวเลขเท่านั้น
КонстантинВан


16
String.prototype.isNumber = function(){return /^\d+$/.test(this);}
console.log("123123".isNumber()); // outputs true
console.log("+12".isNumber()); // outputs false

2
มันถือเป็นการปฏิบัติที่ไม่ดีใน Javascript เพื่อปรับเปลี่ยนต้นแบบของวัตถุในตัว (หลักการของความประหลาดisNumber = () => /^\d+$/.test(this);console.log(isNumber("123123));
Nick Bull

2
FWIW ในปี 2009 เมื่อคำตอบนี้ถูกโพสต์ก็ยังไม่ถือว่าการปฏิบัติที่ไม่ดี คู่แข่ง jQuery หลายรายที่มีอยู่ก่อนที่ jQuery จะยังไม่ชนะส่วนขยายต้นแบบที่ฝึกฝนทั้งหมด
balupton

14

หากคุณต้องการรองรับค่าทศนิยม (ค่าที่คั่นด้วยจุด) คุณสามารถใช้นิพจน์นี้ได้:

var isNumber = /^\d+\.\d+$/.test(value);

อย่างไรก็ตามหากคุณไม่ได้ใช้โฟลตค่อนข้าง int มันจะคืนค่าเท็จโดยใช้ "?" หลังจาก ". \" แก้ไขไปแล้ว ผมขอแนะนำให้ /^\d+[\.,\,]?\d+$/.test(value นี้) เพื่อให้ทั้งจุลภาคและทศนิยมจุด (ต่อมาอาจจะสามารถเปลี่ยนไปยังจุดจุลภาค)
Lucke

@Lucke, regex ที่คุณแนะนำจะสามารถที่จะหาตัวเลขที่มีทศนิยมหรือสูงกว่า 9. ถ้าคุณเปลี่ยนคนแรกที่\d+ไป\d*?ก็จะสามารถที่จะตรงกับ 0-9 เช่นเดียวกับตัวเลขเช่น 333
Gust รถตู้ de Wal

5
ปิด: var isNumber = /^\d*\.?\d+$/.test(value)- ตรงกับ '3.5', '.5', '3' - ไม่ตรงกับ '3. '
Peter Hollingsworth

7

นี่เป็นอีกวิธีที่น่าสนใจและสามารถอ่านได้เพื่อตรวจสอบว่าสตริงมีตัวเลขเท่านั้น

วิธีนี้ทำงานโดยการแยกสตริงออกเป็นอาร์เรย์โดยใช้ตัวดำเนินการสเปรดจากนั้นใช้every()วิธีทดสอบว่าองค์ประกอบทั้งหมด (ตัวอักษร) ในอาร์เรย์นั้นรวมอยู่ในสตริงตัวเลขหรือไม่'0123456789':

const digits_only = string => [...string].every(c => '0123456789'.includes(c));

console.log(digits_only('123')); // true
console.log(digits_only('+123')); // false
console.log(digits_only('-123')); // false
console.log(digits_only('123.')); // false
console.log(digits_only('.123')); // false
console.log(digits_only('123.0')); // false
console.log(digits_only('0.123')); // false
console.log(digits_only('Hello, world!')); // false


1
สิ่งนี้จะส่งกลับtrueสำหรับสตริงว่าง''และอาเรย์ที่ว่างเปล่า[]คืออาร์เรย์ของจำนวนเต็ม[1, 2, 3](เมื่อเป็น <10) มันมีแนวโน้มที่จะเป็นโรคจิต / ใช้ผิดมากกว่าการแสดงออกปกติขั้นพื้นฐานที่/^\d+$/ฉันคิดว่า
Drenai


5

นี่คือวิธีแก้ปัญหาโดยไม่ใช้นิพจน์ทั่วไป:

function onlyDigits(s) {
  for (let i = s.length - 1; i >= 0; i--) {
    const d = s.charCodeAt(i);
    if (d < 48 || d > 57) return false
  }
  return true
}

โดยที่ 48 และ 57 เป็นรหัสถ่านสำหรับ "0" และ "9" ตามลำดับ


5
function isNumeric(x) {
    return parseFloat(x).toString() === x.toString();
}

แม้ว่าสิ่งนี้จะส่งคืนfalseสตริงที่มีเลขศูนย์นำหน้าหรือต่อท้าย



1

หากคุณต้องการรวมค่าทศนิยมด้วยคุณสามารถใช้รหัสต่อไปนี้

theValue=$('#balanceinput').val();
var isnum1 = /^\d*\.?\d+$/.test(theValue);
var isnum2 =  /^\d*\.?\d+$/.test(theValue.split("").reverse().join(""));
alert(isnum1+' '+isnum2);

สิ่งนี้จะทดสอบเฉพาะตัวเลขและตัวเลขที่คั่นด้วย '.' การทดสอบครั้งแรกจะครอบคลุมค่าเช่น 0.1 และ 0 แต่ยัง. 1 มันจะไม่อนุญาตให้ 0 ดังนั้นวิธีการแก้ปัญหาที่ฉันเสนอคือการย้อนกลับค่าดังนั้น .1 จะเป็น 1 จากนั้นการแสดงออกปกติเดียวกันจะไม่อนุญาต

ตัวอย่าง:

 theValue=3.4; //isnum1=true , isnum2=true 
theValue=.4; //isnum1=true , isnum2=false 
theValue=3.; //isnum1=flase , isnum2=true 

-1
c="123".match(/\D/) == null #true
c="a12".match(/\D/) == null #false

หากสตริงมีตัวเลขเพียงหลักมันจะส่งคืนค่าว่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.