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.