Periksa apakah string hanya berisi digit


324

Saya ingin memeriksa apakah a stringhanya berisi digit. Saya menggunakan ini:

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

if (isANumber){
    ..
}

Tetapi menyadari bahwa itu juga memungkinkan +dan -. Pada dasarnya, saya ingin memastikan inputhanya berisi digit dan tidak ada karakter lain. Karena +100dan -5keduanya angka, isNaN()bukan cara yang tepat untuk pergi. Mungkin regexp adalah yang saya butuhkan? Ada tips?

Jawaban:


645

bagaimana tentang

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

1
Ini bagus! Saya ingin tahu apakah tidak mengacu pada digit yang desimal?
dewwwald

5
@dewwwald: Beberapa bahasa menerapkannya berbeda, tetapi dalam JavaScript, \dadalah persis sama dengan [0-9].
Ry-

Di sini Anda dapat menemukan dokumentasi tentang cara Regular Expressionskerjanya
Danfoa

6
/^\d*$/sebagai gantinya , jika Anda menemukan string kosong yang hanya berisi digit .
Константин Ван

@DrorBar Saya minta maaf untuk bahasa Inggris saya yang buruk dan biarkan saya ulangi: "jika Anda menganggap string kosong hanya memiliki digit ."
Константин Ван


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

2
Ini dianggap praktik buruk dalam Javascript untuk memodifikasi prototipe objek bawaan (prinsip paling tidak mengejutkan, dan potensi konflik dalam versi ECMA masa depan) - pertimbangkan isNumber = () => /^\d+$/.test(this);sebagai gantinya, dan gunakan sebagaiconsole.log(isNumber("123123));
Nick Bull

2
FWIW, pada tahun 2009 ketika jawaban ini diposting, itu belum dianggap praktik yang buruk. Beberapa pesaing jQuery yang ada saat itu, sebelum jQuery belum menang, semua mempraktikkan ekstensi prototipe.
balupton

14

Jika Anda ingin bahkan mendukung nilai float (Nilai dipisahkan dot) maka Anda dapat menggunakan ungkapan ini:

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

namun jika Anda tidak menggunakan float, bukan int, itu akan mengembalikan false mungkin menggunakan "?" setelah ". \" menyelesaikannya. Saya menyarankan ini /^\d+[\.,\,[?\d+$/.test(value) untuk memungkinkan koma dan titik desimal (nanti mungkin dapat mengubah koma ke titik)
Lucke

@Lucke, regex yang Anda sarankan hanya akan dapat menemukan angka dengan desimal atau lebih tinggi dari 9. Jika Anda mengubah yang pertama \d+ke \d*?, itu akan dapat mencocokkan 0 - 9, serta angka-angka seperti .333
Gust van de Wal

5
Tutup: var isNumber = /^\d*\.?\d+$/.test(value)- cocok dengan '3.5', '.5', '3' - tidak cocok dengan '3.'
Peter Hollingsworth

7

Berikut ini adalah cara lain yang menarik dan mudah dibaca untuk memeriksa apakah string hanya berisi digit.

Metode ini berfungsi dengan memisahkan string menjadi array menggunakan operator spread , dan kemudian menggunakan every()metode untuk menguji apakah semua elemen (karakter) dalam array termasuk dalam string digit '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
Ini juga akan mengembalikan truestring kosong '', dan array kosong [], array bilangan bulat [1, 2, 3](setelah <10). Ini lebih rentan terhadap bug / penyalahgunaan daripada ekspresi reguler dasar yang /^\d+$/saya pikir
Drenai


5

Inilah solusi tanpa menggunakan ekspresi reguler:

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
}

di mana 48 dan 57 adalah kode char untuk "0" dan "9", masing-masing.


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

Meskipun ini akan kembali falsepada string dengan nol terkemuka atau tertinggal.


2

Nah, Anda bisa menggunakan regex berikut:

^\d+$

1

jika Anda ingin memasukkan nilai float juga Anda dapat menggunakan kode berikut

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

ini akan menguji hanya digit dan digit yang dipisahkan dengan '.' tes pertama akan mencakup nilai-nilai seperti 0,1 dan 0 tetapi juga 0,1, itu tidak akan memungkinkan 0 sehingga solusi yang saya usulkan adalah membalikkan theValue sehingga .1 akan menjadi 1. maka ekspresi reguler yang sama tidak akan mengizinkannya.

contoh:

 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

Jika sebuah string hanya berisi angka, itu akan mengembalikan nol

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.