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?

Odpowiedzi:


644

Co powiesz na

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

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 ”.
Константин Ван


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

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);

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


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

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”.


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

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


2

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

^\d+$

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 

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.