Dizenin yalnızca rakam içerip içermediğini kontrol edin


324

stringA'nın yalnızca rakam içerip içermediğini kontrol etmek istiyorum . Bunu kullandım:

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

if (isANumber){
    ..
}

Ama bunun da izin verdiğini fark etti +ve -. Temel olarak, bir inputSADECE rakamlar içerdiğinden ve başka karakter içermediğinden emin olmak istiyorum . Çünkü +100ve -5her ikisi de sayıdır, isNaN()gitmek için doğru yol değildir. Belki ihtiyacım olan bir normal ifade? Herhangi bir ipucu?

Yanıtlar:


644

ne dersin

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

1
Bu harika! Merak ediyorum \ 'ondalık basamaktan bahsetmiyor mu?
dewwwald

5
@dewwwald: Bazı diller farklı bir şekilde uygulamak, ancak JavaScript, \dolduğu tam olarak denk [0-9].
Ry-

Burada nasıl Regular Expressionsçalıştığı ile ilgili belgeleri bulabilirsiniz
Danfoa

6
/^\d*$/bunun yerine , yalnızca rakam içeren boş bir dize bulursanız .
Константин Ван

@DrorBar Zavallı İngilizcem için özür dilerim ve yeniden ifade etmeme izin verin: “boş bir dizenin yalnızca rakamlara sahip olduğunu düşünüyorsanız .”
Константин Ван


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

2
Javascript'te yerleşik nesnelerin prototiplerini değiştirmek (en azından sürpriz prensibi ve gelecekteki ECMA sürümlerinde potansiyel çatışmalar) değiştirmek kötü bir uygulama olarak kabul edilir - isNumber = () => /^\d+$/.test(this);bunun yerine düşünün ve kullanınconsole.log(isNumber("123123));
Nick Bull

2
FWIW, bu cevabın gönderildiği 2009 yılında henüz kötü bir uygulama olarak değerlendirilmedi. O zaman var olan jQuery yarışmacıları, jQuery henüz kazanmamıştı, hepsi prototip uzantılarını uyguladılar.
balupton

14

Kayan noktalı değerler (Noktadan ayrılmış değerler) için bile destek vermek istiyorsanız, bu ifadeyi kullanabilirsiniz:

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

ancak int yerine float kullanmazsanız yanlış "?" sonra ". \" çözüldü. Ben bu virgül ve nokta ondalık (daha sonra belki virgül noktaya dönüştürebilirsiniz) izin vermek için bu /^\d+[\.,\, closeup?\d+$/.test(value) öneririz
Lucke

@Lucke, önerilen regex yalnızca ilk değiştirirseniz bir ondalık ile sayılar veya daha yüksek 9. bulmak mümkün olacak \d+kadar \d*?böyle .333 olarak sayıların yanı sıra 9 - 0 maç mümkün olacak,
Bora van de Wal

5
Kapat: var isNumber = /^\d*\.?\d+$/.test(value)- '3.5', '.5', '3' ile eşleşir - '3' ile eşleşmez.
Peter Hollingsworth

7

Bir dizenin yalnızca rakam içerip içermediğini kontrol etmenin başka ilginç ve okunabilir bir yolu.

Bu yöntem, yayma işlecini kullanarak dizeyi bir diziye bölerek çalışır ve sonra every()dizideki tüm öğelerin (karakterlerin) basamak dizesine dahil edilip edilmediğini sınamak için yöntemi kullanır '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
Bu, trueboş dize ''ve boş []bir dizi, tamsayılar dizisi için de döndürülür [1, 2, 3](<10 olduklarında). /^\d+$/Sanırım temel normal ifade daha hata / kötüye eğilimli
Drenai


5

İşte düzenli ifadeler kullanmadan bir çözüm:

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
}

burada 48 ve 57 sırasıyla "0" ve "9" için karakter kodlarıdır.


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

Gerçi bu, falseönde veya arkada sıfır olan dizelere dönecektir .


2

Aşağıdaki regex'i kullanabilirsiniz:

^\d+$

1

kayan nokta değerlerini dahil etmek istiyorsanız aşağıdaki kodu da kullanabilirsiniz

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

bu yalnızca '.' ile ayrılmış rakamları ve rakamları test eder. ilk test 0.1 ve 0 gibi değerleri de kapsayacaktır, aynı zamanda .1, 0'a izin vermez.

misal :

 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

Bir dize yalnızca rakam içeriyorsa null değerini döndürür

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.