Comment vérifier si une variable est un entier en JavaScript et lancer une alerte si ce n'est pas le cas? J'ai essayé, mais cela ne fonctionne pas:
<html>
<head>
<script type="text/javascript">
var data = 22;
alert(NaN(data));
</script>
</head>
</html>
javascript
JBa
la source
la source
parseInt
.Number.isInteger
la méthode la moins hacky.Réponses:
Utilisez l'opérateur === ( égalité stricte ) comme ci-dessous,
la source
2.0 === 2
comme la décimale inutile n'est qu'une représentation différente du même nombre, elleparseInt(2.0) === 2.0
est donc équivalente àparseInt(2) === 2
ce qui est vraiCela dépend, voulez-vous également convertir des chaînes en entiers potentiels?
Cela fera:
Avec opérations au niveau du bit
Analyse et vérification simples
Court-circuit et sauvegarde d'une opération d'analyse:
Ou peut-être les deux d'un seul coup:
Tests:
Voici le violon: http://jsfiddle.net/opfyrqwp/28/
Performance
Les tests révèlent que la solution de court-circuit présente les meilleures performances (ops / sec).
Voici une référence: http://jsben.ch/#/htLVw
Si vous souhaitez une forme de court-circuit plus courte et obtuse:
Bien sûr, je suggère de laisser le minificateur s'en occuper.
la source
En supposant que vous ne connaissiez rien de la variable en question, vous devriez adopter cette approche:
Pour le dire simplement:
la source
"1.0"
est une chaîne et n'est donc pas un nombre. Sinon, ce1
sera la valeur d'une variable si vous la définissez ainsivar my_var=1.0;
, ce qui est correctement identifié par cette fonction comme un entier.Number.isInteger()
ça marchera ... jusque-là, c'est une bonne façon de le faireNumber.isInteger()
semble être la voie à suivre.MDN a également fourni le polyfill suivant pour les navigateurs ne prenant pas en charge
Number.isInteger()
, principalement toutes les versions d'IE.Lien vers la page MDN
la source
Vous pouvez vérifier si le numéro a un reste:
Attention, si votre entrée peut également être du texte et que vous voulez d'abord vérifier qu'elle ne l'est pas, vous pouvez d'abord vérifier le type:
la source
0 % 1 === 0
dans la console. Il revient entrue
tant que0 % 1
retours0
.0 % 1
retourne0
en mode de compatibilité IE9, IE8 et IE7.Vous pouvez utiliser une expression régulière simple:
la source
Tout d'abord, NaN est un "nombre" (oui je sais que c'est bizarre, roule avec), et non une "fonction".
Vous devez vérifier à la fois si le type de la variable est un nombre, et pour vérifier l'entier, j'utiliserais le module.
la source
(0 == 0 || 0 % 1 == 0)
évalueratrue
.0 % 1 == 0
évalue également àtrue
!%
n'est pas la division!Soyez prudent lors de l'utilisation
une chaîne vide ('') ou booléenne (vrai ou faux) renverra comme entier. Vous pourriez ne pas vouloir faire ça
Number.isInteger (données)
construire dans la fonction dans le navigateur. Dosnt prend en charge les anciens navigateurs
Alternatives:
Cependant, Math.round () échouera également pour les chaînes vides et booléennes
la source
Pour vérifier si un entier comme l'affiche veut:
notez + devant les données (convertit la chaîne en nombre) et === pour exact.
Voici quelques exemples:
la source
return (+data===parseInt(data))
?la source
La solution pré-ECMAScript-6 la plus simple et la plus propre (qui est également suffisamment robuste pour retourner false même si une valeur non numérique telle qu'une chaîne ou null est passée à la fonction) serait la suivante:
La solution suivante fonctionnerait également, mais pas aussi élégante que celle ci-dessus:
Remarque que Math.ceil () ou Math.floor () pourrait être utilisé aussi bien (au lieu de Math.round ()) dans l'implémentation ci-dessus.
Ou bien:
Une solution incorrecte assez courante est la suivante:
Bien que cette approche basée sur parseInt fonctionne bien pour de nombreuses valeurs de x, une fois que x devient assez grand, il ne fonctionnera pas correctement. Le problème est que parseInt () contraint son premier paramètre à une chaîne avant d'analyser les chiffres. Par conséquent, une fois que le nombre devient suffisamment grand, sa représentation sous forme de chaîne sera présentée sous forme exponentielle (par exemple, 1e + 21). Par conséquent, parseInt () tentera alors d'analyser 1e + 21, mais arrêtera l'analyse quand il atteindra le caractère e et retournera donc une valeur de 1. Observez:
la source
Pourquoi personne n'a-t-il mentionné
Number.isInteger()
t-il ?https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
Fonctionne parfaitement pour moi et résout le problème avec le
NaN
début d'un certain nombre.la source
Number.isInteger()
, 3,5 ans avant vous: stackoverflow.com/a/27424770/5208540Dans ES6, 2 nouvelles méthodes sont ajoutées pour l'objet numérique.
La méthode Number.isInteger () y renvoie true si l'argument est un entier.
Exemple d'utilisation:
la source
La norme ECMA-262 6.0 (ES6) inclut Number.isInteger fonction .
Afin d'ajouter la prise en charge de l'ancien navigateur, je recommande fortement d'utiliser une solution solide et prise en charge par la communauté de:
https://github.com/paulmillr/es6-shim
qui est une pure bibliothèque de polyfills ES6 JS .
Notez que cette bibliothèque nécessite es5-shim, suivez simplement README.md.
la source
Vous pouvez essayer
Number.isInteger(Number(value))
s'ilvalue
peut s'agir d'un entier sous forme de chaîne, par exemple,var value = "23"
et vous souhaitez que cela soit évaluétrue
. Évitez d'essayerNumber.isInteger(parseInt(value))
car cela ne retournera pas toujours la valeur correcte. Par exemple, sivar value = "23abc"
et que vous utilisez l'parseInt
implémentation, elle retournera toujours true.Mais si vous voulez des valeurs strictement entières, vous
Number.isInteger(value)
devriez probablement faire l'affaire.la source
la source
Vérifiez si la variable est égale à cette même variable arrondie à un entier, comme ceci:
la source
true
pourNaN
, en changeant simplement!=
de!==
et inverser lesif
blocs. Cela fonctionne parce queNaN
c'est la seule valeur en JavaScript qui ne s'égale pas. Par exemple, le nouveau code devrait êtreif (Math.round(x) === x) { /* x IS an integer! */ }
Par ailleurs,
Number.isInteger()
. PeutNumber.isSafeInteger()
- être est une autre option ici en utilisant l'ES6 spécifié.Pour polyfill
Number.isSafeInteger(..)
dans les navigateurs pré-ES6:la source
Number.isInteger()
est le meilleur moyen si votre navigateur le prend en charge, sinon, je pense qu'il y a tellement de façons de procéder:ou:
ou:
ou:
maintenant nous pouvons tester les résultats:
Donc, toutes ces méthodes fonctionnent, mais lorsque le nombre est très grand, parseInt et l'opérateur ^ ne fonctionneraient pas bien.
la source
Essayez ceci:
la source
Vous pouvez utiliser cette fonction:
Il retournera vrai même si la valeur est une chaîne contenant une valeur entière.
Ainsi, les résultats seront:
la source
Mon approche:
a >= 1e+21
Le test ne peut réussir que pour une valeur qui doit être un nombre et une très grande. Cela couvrira tous les cas à coup sûr, contrairement aux autres solutions qui ont été fournies dans cette discussion.a === (a|0)
Si l'argument de la fonction donnée est exactement (===) identique à la valeur transformée au niveau du bit, cela signifie que l'argument est un entier.a|0
retournera0
pour toute valeura
qui n'est pas un nombre , et s'ila
s'agit bien d'un nombre, il supprimera tout ce qui est après la virgule décimale,1.0001
deviendra donc1
la source
Vous pouvez utiliser regexp pour cela:
la source
Sur http://www.toptal.com/javascript/interview-questions :
J'ai trouvé que c'était la meilleure façon de le faire.
la source
Utilisez l'
|
opérateur:Ainsi, une fonction de test pourrait ressembler à ceci:
la source
Cela résoudra un autre scénario ( 121. ), un point à la fin
la source
Pour les valeurs entières positives sans séparateurs:
Teste 1. s'il n'est pas vide et 2. si la valeur est égale au résultat du remplacement d'un caractère non numérique dans sa valeur.
la source
Ok eu moins, car n'a pas décrit mon exemple, donc plus d'exemples :):
J'utilise l'expression régulière et la méthode de test:
la source
vous pouvez également l'essayer de cette façon
ou
la source
data=22.5;
. De plus, les deux succursales ontconsole.log("not an integer")
:: SJ'ai dû vérifier si une variable (chaîne ou nombre) est un entier et j'ai utilisé cette condition:
http://jsfiddle.net/e267369d/1/
Certaines des autres réponses ont une solution similaire (compter sur
parseFloat
combiné avecisNaN
), mais la mienne devrait être plus simple et s'expliquer d'elle-même.Edit: j'ai découvert que ma méthode échoue pour les chaînes contenant des virgules (comme "1,2") et j'ai également réalisé que dans mon cas particulier, je veux que la fonction échoue si une chaîne n'est pas un entier valide (devrait échouer sur n'importe quel flottant , même 1.0). Voici donc ma fonction Mk II:
http://jsfiddle.net/e267369d/3/
Bien sûr, si vous avez réellement besoin de la fonction pour accepter des flottants entiers (1.0), vous pouvez toujours supprimer la condition de point
a.indexOf('.') == -1
.la source