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?

Réponses:


647

que diriez-vous

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

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


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

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

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


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


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.


2

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

^\d+$

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 

-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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.