Sprawdź, czy ciąg zawiera tylko cyfry

324

Chcę sprawdzić, czy stringzawiera tylko cyfry. Użyłem tego:

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

if (isANumber){
    ..
}

Ale zdałem sobie sprawę, że to pozwala +i -. Zasadniczo chcę się upewnić, że inputzawiera TYLKO cyfry i nie ma innych znaków. Ponieważ +100i -5oba są liczbami, isNaN()nie jest to właściwa droga. Być może potrzebuję wyrażenia regularnego? Jakieś wskazówki?

patad
źródło

Odpowiedzi:

644

Co powiesz na

var isnum = /^\d+$/.test(val);
Scott Evernden
źródło
1
To jest świetne! Jestem ciekawy, czy nie odnosi się do cyfr dziesiętnych?
dewwwald
5
@dewwwald: Niektóre języki implementują go inaczej, ale w JavaScript \djest dokładnie równoważny z [0-9].
Ry-
Tutaj znajdziesz dokumentację na temat tego, jak Regular Expressionsdziała
Danfoa
6
/^\d*$/zamiast tego , jeśli znajdziesz pusty ciąg zawierający tylko cyfry .
Константин Ван
@DrorBar Przepraszam za mój słaby angielski i pozwól mi sformułować: „jeśli uważasz, że pusty ciąg znaków ma tylko cyfry ”.
Константин Ван
65
string.match(/^[0-9]+$/) != null;
Jason S.
źródło
16
String.prototype.isNumber = function(){return /^\d+$/.test(this);}
console.log("123123".isNumber()); // outputs true
console.log("+12".isNumber()); // outputs false
balupton
źródło
2
W JavaScript jest uważana za złą praktykę modyfikowanie prototypów wbudowanych obiektów (zasada najmniejszego zaskoczenia i potencjalnych konfliktów w przyszłych wersjach ECMA) - rozważ isNumber = () => /^\d+$/.test(this);zamiast tego i użyj jakoconsole.log(isNumber("123123));
Nick Bull
2
FWIW, w 2009 r., Kiedy opublikowano tę odpowiedź, nie została jeszcze uznana za złą praktykę. Kilku konkurentów jQuery, którzy istnieli wtedy, zanim jQuery jeszcze nie wygrało, wszyscy ćwiczyli prototypowe rozszerzenia.
balupton,
14

Jeśli chcesz nawet obsługiwać wartości zmiennoprzecinkowe (wartości rozdzielane kropkami), możesz użyć tego wyrażenia:

var isNumber = /^\d+\.\d+$/.test(value);
Adithya Sai
źródło
jednak jeśli nie użyjesz liczby zmiennoprzecinkowej raczej int, zwróci false, może używając „?” po rozwiązaniu problemu przez „. \”. Proponuję to /^\d+[\.,\,]?\d+$/.test(value), aby umożliwić przecinek i przecinek dziesiętny (później może przekształcić przecinek w punkt)
Lucke,
@Lucke, regex, który zasugerowałeś, będzie mógł znaleźć tylko liczby dziesiętne lub wyższe niż 9. Jeśli zmienisz pierwszy \d+na \d*?, będzie mógł dopasować 0 - 9, a także liczby takie jak .333
Gust van de Wal
5
Zamknij: var isNumber = /^\d*\.?\d+$/.test(value)- pasuje do „3.5”, „.5”, „3” - nie pasuje do „3.”
Peter Hollingsworth
7

Oto kolejny ciekawy, czytelny sposób sprawdzenia, czy łańcuch zawiera tylko cyfry.

Ta metoda działa poprzez podzielenie łańcucha na tablicę za pomocą operatora rozkładania , a następnie używa every()metody do sprawdzenia, czy wszystkie elementy (znaki) w tablicy są zawarte w ciągu cyfr '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

Grant Miller
źródło
1
Zwróci to również truepusty ciąg ''i pustą tablicę [], tablicę liczb całkowitych [1, 2, 3](gdy będą miały <10). /^\d+$/Myślę, że jest bardziej podatny na błędy / niewłaściwe użycie niż podstawowe wyrażenie regularne
Drenai,
5

To jest to, czego chcesz

function isANumber(str){
  return !/\D/.test(str);
}
Saranga Jayaruwan
źródło
5

Oto rozwiązanie bez użycia wyrażeń regularnych:

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
}

gdzie 48 i 57 to kody znaków odpowiednio dla „0” i „9”.

SC1000
źródło
5
function isNumeric(x) {
    return parseFloat(x).toString() === x.toString();
}

Chociaż zwróci to falseciągi z wiodącymi lub końcowymi zerami.

Peter Hollingsworth
źródło
2

Cóż, możesz użyć następującego wyrażenia regularnego:

^\d+$
Joey
źródło
1

jeśli chcesz dołączyć wartości zmiennoprzecinkowe, możesz także użyć następującego kodu

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

spowoduje to sprawdzenie tylko cyfr i cyfr oddzielonych znakiem „.” pierwszy test obejmie wartości takie jak 0,1 i 0, ale również .1, nie pozwoli na 0. więc rozwiązaniem, które proponuję, jest odwrócenie wartości, więc .1 będzie 1. wtedy to samo wyrażenie regularne na to nie pozwoli.

przykład:

 theValue=3.4; //isnum1=true , isnum2=true 
theValue=.4; //isnum1=true , isnum2=false 
theValue=3.; //isnum1=flase , isnum2=true 
anouar es-sayid
źródło
-1
c="123".match(/\D/) == null #true
c="a12".match(/\D/) == null #false

Jeśli ciąg zawiera tylko cyfry, zwróci null

Lakhani Aliraza
źródło