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.