Vérifiez si la chaîne ne contient que des chiffres

325

Je veux vérifier si un stringne contient que des chiffres. J'ai utilisé ceci:

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

if (isANumber){
    ..
}

Mais réalisé qu'il permet également +et -. Fondamentalement, je veux m'assurer qu'un inputcontient uniquement des chiffres et aucun autre caractère. Depuis +100et -5sont les deux nombres,isNaN() n'est pas la bonne façon de procéder. Peut-être qu'une expression rationnelle est ce dont j'ai besoin? Des conseils?

patad
la source

Réponses:

647

que diriez-vous

let isnum = /^\d+$/.test(val);
Scott Evernden
la source
1
C'est bien! Je suis curieux de ne pas faire référence à un chiffre décimal?
dewwwald
5
@dewwwald: Certains langages l'implémentent différemment, mais en JavaScript, \dc'est exactement équivalent à [0-9].
Ry-
Ici vous pouvez trouver de la documentation sur le Regular Expressionsfonctionnement
Danfoa
6
/^\d*$/à la place , si vous trouvez une chaîne vide contenant uniquement des chiffres .
Константин Ван
@DrorBar Je suis désolé pour mon pauvre anglais et permettez-moi de le reformuler: "si vous considérez qu'une chaîne vide n'a que des chiffres ."
Константин Ван
65
string.match(/^[0-9]+$/) != null;
Jason S
la source
16
String.prototype.isNumber = function(){return /^\d+$/.test(this);}
console.log("123123".isNumber()); // outputs true
console.log("+12".isNumber()); // outputs false
balupton
la source
2
Il est considéré comme une mauvaise pratique en Javascript de modifier les prototypes d'objets intégrés (principe de la moindre surprise et conflits potentiels dans les futures versions de l'ECMA) - considérez isNumber = () => /^\d+$/.test(this);plutôt et utilisez commeconsole.log(isNumber("123123));
Nick Bull
2
FWIW, en 2009, lorsque cette réponse a été publiée, elle n'était pas encore considérée comme une mauvaise pratique. Plusieurs concurrents de jQuery qui existaient alors, avant que jQuery n'ait encore gagné, pratiquaient tous des extensions de prototypes.
balupton
14

Si vous souhaitez même prendre en charge les valeurs flottantes (valeurs séparées par des points), vous pouvez utiliser cette expression:

var isNumber = /^\d+\.\d+$/.test(value);
Adithya Sai
la source
cependant si vous n'utilisez pas un float plutôt que int, il retournera false peut-être en utilisant "?" après ". \" résolu cela. Je suggère ce /^\d+[\.,\,]?\d+$/.test(value) pour permettre à la fois une virgule et un point décimal (plus tard peut-être transformer une virgule à point)
Lucke
@Lucke, l'expression régulière que vous avez suggérée ne pourra trouver que des nombres avec un nombre décimal ou supérieur à 9. Si vous changez le premier \d+en \d*?, il pourra faire correspondre 0 - 9, ainsi que des nombres tels que .333
Gust van de Wal
5
Fermer: var isNumber = /^\d*\.?\d+$/.test(value)- correspond à '3.5', '.5', '3' - ne correspond pas à '3.'
Peter Hollingsworth
7

Voici une autre façon intéressante et lisible de vérifier si une chaîne ne contient que des chiffres.

Cette méthode fonctionne en divisant la chaîne en un tableau à l'aide de l' opérateur d'étalement , puis utilise la every()méthode pour tester si tous les éléments (caractères) du tableau sont inclus dans la chaîne de chiffres '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
la source
1
Cela renverra également trueune chaîne vide ''et un tableau vide [], un tableau d'entiers [1, 2, 3](une fois qu'ils sont <10). Il est plus sujet aux bugs / abus que l'expression régulière de base /^\d+$/je pense
Drenai
5

Voici ce que tu veux

function isANumber(str){
  return !/\D/.test(str);
}
Saranga Jayaruwan
la source
5

Voici une solution sans utiliser d'expressions régulières:

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
}

où 48 et 57 sont les codes de caractères pour "0" et "9", respectivement.

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

Bien que cela revienne falsesur les chaînes avec des zéros de début ou de fin.

Peter Hollingsworth
la source
2

Eh bien, vous pouvez utiliser l'expression régulière suivante:

^\d+$
Joey
la source
1

si vous souhaitez inclure des valeurs flottantes, vous pouvez également utiliser le code suivant

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

cela testera uniquement les chiffres et les chiffres séparés par "." le premier test couvrira des valeurs telles que 0,1 et 0 mais également 0,1, il ne permettra pas 0. donc la solution que je propose est d'inverser la valeur donc 0,1 sera 1. alors la même expression régulière ne le permettra pas.

exemple :

 theValue=3.4; //isnum1=true , isnum2=true 
theValue=.4; //isnum1=true , isnum2=false 
theValue=3.; //isnum1=flase , isnum2=true 
anouar es-sayid
la source
-1
c="123".match(/\D/) == null #true
c="a12".match(/\D/) == null #false

Si une chaîne ne contient que des chiffres, elle renverra null

Lakhani Aliraza
la source