Controlla se la stringa contiene solo cifre


324

Voglio verificare se a stringcontiene solo cifre. Ho usato questo:

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

if (isANumber){
    ..
}

Ma ho capito che permette anche +e -. Fondamentalmente, voglio essere sicuro che inputcontenga SOLO cifre e nessun altro personaggio. Poiché +100e -5sono entrambi numeri, isNaN()non è la strada giusta da percorrere. Forse una regexp è ciò di cui ho bisogno? Qualche consiglio?

Risposte:


645

che ne dite di

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

1
Questo è fantastico! Sono curioso non si riferisce a cifre decimali?
Dewwwald,

5
@dewwwald: alcune lingue lo implementano in modo diverso, ma in JavaScript \dè esattamente equivalente a [0-9].
Ry-

Qui puoi trovare la documentazione su come Regular Expressionsfunziona
Danfoa,

6
/^\d*$/invece , se trovi una stringa vuota contenente solo cifre .
Константин Ван

@DrorBar Mi dispiace per il mio povero inglese e mi permetto di riformularlo: "se si considera che una stringa vuota contiene solo cifre ".
Константин Ван,


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

2
È considerato una cattiva pratica in Javascript modificare i prototipi di oggetti incorporati (principio della minima sorpresa e potenziali conflitti nelle future versioni dell'ECMA) - considera isNumber = () => /^\d+$/.test(this);invece, e usa comeconsole.log(isNumber("123123));
Nick Bull,

2
FWIW, nel 2009, quando questa risposta è stata pubblicata, non era ancora considerata una cattiva pratica. Numerosi concorrenti di jQuery che esistevano allora, prima che jQuery dovesse ancora vincere, tutti praticavano estensioni prototipo.
Balupton,

14

Se si desidera supportare anche i valori float (valori separati da punti), è possibile utilizzare questa espressione:

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

tuttavia se non si utilizza un float piuttosto che int restituirà falso forse usando "?" dopo ". \" risolto. Suggerisco questo /^\d+[\.,\,[?\d+$/.test(value) per consentire sia la virgola che il punto decimale (in seguito forse può trasformare la virgola in punto)
Lucke

@Lucke, la regex che hai suggerito sarà in grado di trovare solo numeri con un decimale o maggiore di 9. Se cambi il primo \d+in \d*?, sarà in grado di abbinare 0 - 9, così come numeri come .333
Gust van de Wal,

5
Chiudi: var isNumber = /^\d*\.?\d+$/.test(value)- corrisponde a "3.5", ".5", "3" - non corrisponde a "3."
Peter Hollingsworth,

7

Ecco un altro modo interessante e leggibile per verificare se una stringa contiene solo cifre.

Questo metodo funziona suddividendo la stringa in un array utilizzando l' operatore spread , quindi utilizza il every()metodo per verificare se tutti gli elementi (caratteri) dell'array sono inclusi nella stringa di cifre '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
Ciò restituirà anche trueuna stringa vuota ''e una matrice vuota [], una matrice di numeri interi [1, 2, 3](una volta che sono <10). È più soggetto a bug / uso improprio rispetto all'espressione regolare di base /^\d+$/che penso
Drenai l'


5

Ecco una soluzione senza usare espressioni regolari:

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
}

dove 48 e 57 sono i codici char per "0" e "9", rispettivamente.


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

Anche se questo ritornerà falsesu stringhe con zero iniziali o finali.


2

Bene, puoi usare la seguente regex:

^\d+$

1

se si desidera includere anche valori float, è possibile utilizzare il seguente codice

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

questo verificherà solo cifre e cifre separate da '.' il primo test coprirà valori come 0.1 e 0 ma anche .1, non consentirà 0. quindi la soluzione che propongo è di invertire il valore in modo che .1 sia 1. quindi la stessa espressione regolare non lo consentirà.

esempio :

 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

Se una stringa contiene solo cifre, restituirà null

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.