J'espère qu'il y a quelque chose dans le même espace conceptuel que l'ancienne IsNumeric()
fonction VB6 ?
javascript
validation
numeric
Electrons_Ahoy
la source
la source
isNaN("")
,isNaN(" ")
,isNaN(false)
, etc. renvoiefalse
pour ces derniers , ce qui implique qu'ils sont des nombres.Réponses:
Pour vérifier si une variable (y compris une chaîne) est un nombre, vérifiez si ce n'est pas un nombre:
Cela fonctionne indépendamment du fait que le contenu variable soit une chaîne ou un nombre.
Exemples
Bien sûr, vous pouvez annuler cela si vous en avez besoin. Par exemple, pour implémenter l'
IsNumeric
exemple que vous avez donné:Pour convertir une chaîne contenant un nombre en nombre:
Fonctionne uniquement si la chaîne ne contient que des caractères numériques, sinon elle retourne
NaN
.Exemples
Pour convertir une chaîne de manière lâche en un nombre
Utile pour convertir '12px' en 12, par exemple:
Exemples
Flotteurs
Gardez à l' esprit que, contrairement à
+num
,parseInt
(comme son nom l' indique) vous permet de convertir un flotteur en un entier en coupant tout ce qui suit le point décimal (si vous souhaitez utiliser enparseInt()
raison de ce comportement, vous êtes probablement mieux d'utiliser une autre méthode à la place ) :Chaînes vides
Les chaînes vides peuvent être un peu contre-intuitives.
+num
convertit les chaînes vides ou les chaînes avec des espaces à zéro etisNaN()
suppose la même chose:Mais
parseInt()
n'est pas d'accord:la source
isNaN
"Pour vérifier si une variable n'est pas un nombre". "not a number" n'est pas la même chose que "IEEE-794 NaN", qui est ce quiisNaN
teste. En particulier, cette utilisation échoue lors du test des booléens et des chaînes vides, au moins. Voir developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .var n = 'a'; if (+n === +n) { // is number }
il est ~ 3994% plus rapide que isNaN dans la dernière version de Chrome. Voir le test de performance ici: jsperf.com/isnan-vs-typeof/5isNaN(1 + false + parseInt("1.do you trust your users?"))
Et vous pouvez utiliser la méthode RegExp:
la source
Si vous essayez simplement de vérifier si une chaîne est un nombre entier (pas de décimales), l'expression régulière est une bonne façon de procéder. D'autres méthodes telles que
isNaN
trop compliquées pour quelque chose d'aussi simple.Pour autoriser uniquement les nombres entiers positifs , utilisez ceci:
la source
/^-?\d+$/
droite?Si vous voulez vraiment vous assurer qu'une chaîne ne contient qu'un nombre, un nombre (entier ou à virgule flottante), et exactement un numéro, vous ne pouvez pas utiliser
parseInt()
/parseFloat()
,Number()
ou!isNaN()
par eux - mêmes. Notez que!isNaN()
revient réellementtrue
quandNumber()
retournerait un nombre, etfalse
quand il retourneraitNaN
, donc je l'exclurai du reste de la discussion.Le problème avec
parseFloat()
est qu'il retournera un nombre si la chaîne contient n'importe quel nombre, même si la chaîne ne contient pas seulement et exactement un nombre:Le problème
Number()
est qu'il retournera un nombre dans les cas où la valeur transmise n'est pas du tout un nombre!Le problème avec le roulement de votre propre expression régulière est que, sauf si vous créez l'expression exacte exacte pour correspondre à un nombre à virgule flottante car Javascript le reconnaît, vous allez manquer des cas ou reconnaître des cas où vous ne devriez pas. Et même si vous pouvez rouler votre propre regex, pourquoi? Il existe des moyens intégrés plus simples de le faire.
Cependant, il s'avère que
Number()
(etisNaN()
) fait la bonne chose pour chaque cas oùparseFloat()
renvoie un nombre alors qu'il ne devrait pas, et vice versa. Donc, pour savoir si une chaîne est vraiment exactement et seulement un nombre, appelez les deux fonctions et voyez si elles retournent toutes les deux vrai:la source
' 1'
,'2 '
Et' 3 '
tout retour vrai.isNumber
fonction ne s'occupent pas des interfaces utilisateur. De plus, une bonne entrée de nombre ne permettra pas de commencer par les espaces.La réponse acceptée pour cette question a quelques défauts (comme l'ont souligné quelques autres utilisateurs). C'est l'un des moyens les plus simples et éprouvés de l'aborder en javascript:
Voici quelques bons cas de test:
la source
Essayez la fonction isNan :
la source
isNaN()
renvoiefalse
pour TOUTE chaîne contenant uniquement des caractères d'espacement, y compris des éléments comme '\ u00A0'.Vieille question, mais il manque plusieurs points dans les réponses données.
Notation scientifique.
!isNaN('1e+30')
esttrue
, cependant, dans la plupart des cas, lorsque les gens demandent des chiffres, ils ne veulent pas faire correspondre des choses comme1e+30
.Les grands nombres flottants peuvent se comporter bizarrement
Observez (en utilisant Node.js):
D'autre part:
Donc, si l'on attend
String(Number(s)) === s
, mieux vaut limiter vos chaînes à 15 chiffres au maximum (après avoir omis les zéros de tête).Infini
Compte tenu de tout cela, vérifier que la chaîne donnée est un nombre satisfaisant à toutes les conditions suivantes:
Number
et retour àString
n'est pas une tâche si facile. Voici une version simple:
Cependant, même celui-ci est loin d'être terminé. Les zéros non significatifs ne sont pas traités ici, mais ils vissent le test de longueur.
la source
J'ai testé et la solution de Michael est la meilleure. Votez pour sa réponse ci-dessus (recherchez sur cette page "Si vous voulez vraiment vous assurer qu'une chaîne" pour la trouver). En substance, sa réponse est la suivante:
Cela fonctionne pour chaque cas de test, que j'ai documenté ici: https://jsfiddle.net/wggehvp9/5/
La plupart des autres solutions échouent pour ces cas limites: '', null, "", true et []. En théorie, vous pouvez les utiliser avec une gestion des erreurs appropriée, par exemple:
ou
avec une gestion spéciale pour / \ s /, null, "", true, false, [] (et autres?)
la source
Vous pouvez utiliser le résultat de Number lorsque vous passez un argument à son constructeur.
Si l'argument (une chaîne) ne peut pas être converti en nombre, il renvoie NaN, vous pouvez donc déterminer si la chaîne fournie était un nombre valide ou non.
Remarques: Notez lorsque vous passez une chaîne vide ou
'\t\t'
et'\n\t'
que Number renvoie 0; La réussite de true renvoie 1 et false renvoie 0.la source
Number
constructeur est exactement le même que+x
.Number()
gère également les nombres flottants, commeNumber.parseFloat()
nonNumber.parseInt()
Peut-être qu'une ou deux personnes rencontrent cette question qui ont besoin d'un contrôle beaucoup plus strict que d'habitude (comme je l'ai fait). Dans ce cas, cela pourrait être utile:
Il faut se méfier! Cela rejette les chaînes comme
.1
,40.000
,080
,00.1
. C'est très difficile - la chaîne doit correspondre à la " forme parfaite la plus minimale " du nombre pour que ce test réussisse.Il utilise le constructeur
String
etNumber
pour convertir la chaîne en un nombre et inversement et vérifie ainsi si la "forme minimale parfaite" du moteur JavaScript (celle à laquelle il a été converti avec leNumber
constructeur initial ) correspond à la chaîne d'origine.la source
(str === String(Math.round(Number(str))))
."Infinity"
,"-Infinity"
et"NaN"
passer ce test. Cependant, cela peut être résolu à l'aide d'unNumber.isFinite
test supplémentaire .str === ("" + +str)
. Il vérifie essentiellement si la chaîne est le résultat de la chaîne d'un numéro JS. Sachant cela, nous pouvons également voir un problème: le test réussit0.000001
mais échoue0.0000001
, c'est-à-dire quand1e-7
passe à la place. De même pour les très gros nombres.parseInt (), mais sachez que cette fonction est un peu différente en ce sens qu'elle retourne par exemple 100 pour parseInt ("100px").
la source
parseInt(09)
.paraseInt(09, 10)
, 10
argument.parseInt('09')
est maintenant égal à 9.Citation:
n'est pas entièrement vrai si vous devez vérifier les espaces de début / fin - par exemple lorsqu'une certaine quantité de chiffres est requise, et que vous devez obtenir, par exemple, «1111» et non «111» ou «111» pour peut-être un code PIN contribution.
Mieux utiliser:
la source
'-1'
,'0.1'
et'1e10'
toutes renvoient false. De plus, les valeurs supérieures à l'infini positif ou inférieures à l'infini négatif renvoient true, alors qu'elles devraient probablement renvoyer false.Pourquoi l'implémentation de jQuery n'est-elle pas assez bonne?
Michael a suggéré quelque chose comme ça (bien que j'ai volé la version modifiée de "user1691651 - John" ici):
Ce qui suit est une solution avec probablement de mauvaises performances, mais des résultats solides. C'est un engin fabriqué à partir de l'implémentation de jQuery 1.12.4 et de la réponse de Michael, avec une vérification supplémentaire pour les espaces de début / fin (car la version de Michael renvoie vrai pour les chiffres avec des espaces de début / fin):
Cette dernière version a cependant deux nouvelles variables. On pourrait contourner l'un d'entre eux en faisant:
Je n'ai pas testé beaucoup de ceux-ci, autrement que de tester manuellement les quelques cas d'utilisation que je vais rencontrer avec ma situation actuelle, qui est tout à fait standard. Il s'agit d'une situation "debout sur les épaules des géants".
la source
Il n'est pas valide pour TypeScript en tant que:
declare function isNaN(number: number): boolean;
Pour TypeScript, vous pouvez utiliser:
/^\d+$/.test(key)
la source
Eh bien, j'utilise celui que j'ai fait ...
Cela fonctionne jusqu'à présent:
Si vous rencontrez un problème, dites-le moi, s'il vous plaît.
la source
return !isNaN(parseInt(value, 10));
Si quelqu'un arrive aussi loin, j'ai passé du temps à pirater cela en essayant de patcher moment.js ( https://github.com/moment/moment ). Voici quelque chose que j'en ai retiré:
Gère les cas suivants:
Vrai! :
Faux! :
Ironiquement, celui avec lequel je lutte le plus:
Toutes les suggestions sont les bienvenues. :]
la source
isNumeric(' ')
etisNumeric('')
?&& (val.replace(/\s/g,'') !== '') //Empty && (val.slice(-1) !== '.') //Decimal without Number
afin d'aborder le problème mentionné ci-dessus et celui que j'avais moi-même.Utilisation de JavaScript simple:
Utilisation de Lodash:
la source
la source
2019: Y compris les exemples ES3, ES6 et TypeScript
Peut-être que cela a été refait trop souvent, mais j'ai aussi combattu avec celle-ci aujourd'hui et je voulais poster ma réponse, car je n'ai vu aucune autre réponse qui le fasse aussi simplement ou complètement:
ES3
ES6
Manuscrit
Cela semble assez simple et couvre toutes les bases que j'ai vues sur les nombreux autres postes et que j'ai imaginé moi-même:
Vous pouvez également essayer le vôtre
isNumeric
fonction et juste passer dans ces cas d'utilisation et rechercher «vrai» pour chacun d'eux.Ou, pour voir les valeurs que chacun renvoie:
la source
2019: Contrôle de validité numérique pratique et précis
Souvent, un «nombre valide» signifie un nombre Javascript excluant NaN et Infinity, c'est-à-dire un «nombre fini».
Pour vérifier la validité numérique d'une valeur (à partir d'une source externe par exemple), vous pouvez définir dans le style ESlint Airbnb:
et utilisez-le de cette façon:
la source
PFB la solution de travail:
la source
Épargnez-vous le casse-tête d'essayer de trouver une solution «intégrée».
Il n'y a pas de bonne réponse, et la réponse extrêmement votée dans ce fil est fausse.
npm install is-number
la source
J'ai récemment écrit un article sur les moyens de garantir qu'une variable est un nombre valide: https://github.com/jehugaleahsa/artifacts/blob/master/2018/typescript_num_hack.md L'article explique comment garantir la virgule flottante ou l'entier, si c'est le cas important (
+x
vs~~x
).L'article suppose que la variable est un
string
ou unnumber
pour commencer ettrim
est disponible / polyfilled. Il ne serait pas difficile de l'étendre pour gérer d'autres types également. Voici la viande de celui-ci:la source
Ma tentative d'un peu déroutant, peut-être pas la meilleure solution
la source
042
) et hexadécimal (0x45f
)Dans mon application, nous n'autorisons que az AZ et 0-9 caractères. J'ai trouvé la réponse ci-dessus en utilisant " chaîne % 1 === 0" a fonctionné à moins que la chaîne ne commence par 0xnn (comme 0x10) et qu'elle la renvoie sous forme numérique lorsque nous ne le voulons pas. Le simple piège suivant dans ma vérification numérique semble faire l'affaire dans nos cas spécifiques.
Avertissement : Cela pourrait exploiter un bogue de longue date dans Javascript et Actionscript [Number ("1" + the_string)% 1 === 0)], je ne peux pas parler pour cela, mais c'est exactement ce dont nous avions besoin.
la source
% 1
opération numérique sur eux), et cela interprétera la chaîne comme un littéral hexadécimal ou flottant.Ma solution:
Vous pouvez ajouter des conditions supplémentaires à l'intérieur de la boucle, pour répondre à vos besoins particuliers.
la source
Vous pouvez utiliser des types, comme avec la bibliothèque de flux , pour obtenir une vérification statique de l'heure de compilation. Bien sûr, pas terriblement utile pour la saisie des utilisateurs.
la source
Voici une ligne pour vérifier s'il
sNum
s'agit d'une valeur numérique valide; il a été testé pour une grande variété d'entrées:la source
Utilisez simplement
isNaN()
, cela convertira la chaîne en un nombre et si vous obtenez un nombre valide , reviendrafalse
...la source
J'utilise ce qui suit:
la source
1..1
,1,1
,-32.1.12
et ne parvient plus importantundefined
etNaN
. Si vous avez réussiundefined
ouNaN
que cela vous retournerait un faux positif disant que c'était un nombre.