Comment trouver qu'un nombre est float
ou integer
?
1.25 --> float
1 --> integer
0 --> integer
0.25 --> float
javascript
types
numbers
coure2011
la source
la source
<nit-pick>
JavaScript n'a pas différents types numériques entiers et flottants. Chaque numéro en JavaScript n'est qu'unNumber
.</nit-pick>
Infinity
une valeur entière ou non entière en ce qui vous concerne? Les réponses ici sont réparties assez uniformément sur ce point.Infinity
ne peut pas être considéré comme un entier.Réponses:
vérifier un reste lors de la division par 1:
Si vous ne savez pas que l'argument est un nombre, vous avez besoin de deux tests:
Mise à jour 2019 5 ans après la rédaction de cette réponse, une solution a été normalisée dans ECMA Script 2015. Cette solution est couverte dans cette réponse .
la source
true
,false
,null
, un tableau vide, un tableau contenant un seul nombre entier, un tableau contenant une chaîne représentant un nombre entier, et peut - être plus.""
et1.0
isInt("");
&& lesisInt(1.0);
deux résultent entrue
voir cette démo jsbin.com/elohuq/1/editfunction last (array) { return array[array.length - 1]; }
, est-ce "juste faux" ou "pire réponse sur SO" parce qu'il ne vérifie pas si l'argument est un tableau en premier? Oui, bonne pratique pour vérifier les arguments, mais c'est la responsabilité du développeur. Les réponses SO doivent être courtes et répondre directement à la question aussi clairement que possible.Essayez ces fonctions pour tester si une valeur est une valeur primitive numérique qui n'a pas de partie fractionnaire et se situe dans les limites de taille de ce qui peut être représenté comme un entier exact.
la source
n===+n
pour vérifier le numérique,n|0
pour l'arrondir), mais avec des opérateurs intégrés. funkyparseFloat()
abord.|
(OR) ne fonctionnent que sur des entiers 32 bits signés. OP n'indique pas si l'objectif est de vérifier les valeurs int32 signées. Cela ne fonctionnera donc pas avec des numéros hors plage.isInteger(5000000000)
reviendrafalse
qui est faux!Pourquoi pas quelque chose comme ça:
la source
n
est converti en chaîne parparseInt
. Voir MDN . Mais je vais utiliser cette solution. :)Il existe une méthode appelée
Number.isInteger()
qui est actuellement implémentée dans tout sauf IE. MDN fournit également un polyfill pour les autres navigateurs:Cependant, pour la plupart des cas d'utilisation, il vaut mieux utiliser
Number.isSafeInteger
ce qui vérifie également si la valeur est si élevée / basse que les décimales auraient été perdues de toute façon. MDN a également un polyfil pour cela. (Vous avez également besoin duisInteger
pollyfill ci-dessus.)la source
12.0 ∈ ℤ
.Number.isInteger
. Il s'agit cependant d'un polyfill correct pourNumber.isSafeInteger
.Number.isInteger
ne doit pas vérifier si le nombre est un "entier sûr". Voir sur MDN: isInteger et isSafeInteger .Vous pouvez utiliser une expression régulière simple:
Ou vous pouvez également utiliser les fonctions ci-dessous, selon vos besoins. Ils sont développés par le projet PHPJS .
is_int()
=> Vérifier si le type de variable est entier et si son contenu est entieris_float()
=> Vérifier si le type de variable est float et si son contenu est floatctype_digit()
=> Vérifier si le type de variable est une chaîne et si son contenu n'a que des chiffres décimauxMise à jour 1
Maintenant, il vérifie également les nombres négatifs, merci pour le commentaire @ChrisBartley !
la source
/^[0-9]+$/.test(String(value))
/^[0-9]+$/.test(''+value)
return /^-?\d+$/.test(String(value));
Voici des fonctions efficaces qui vérifient si la valeur est un nombre ou peut être convertie en toute sécurité en nombre:
Et pour les entiers (renvoie false si la valeur est un flottant):
L'efficacité ici est que parseInt (ou parseNumber) est évité lorsque la valeur est déjà un nombre. Les deux fonctions d'analyse se convertissent toujours en chaîne d'abord, puis tentent d'analyser cette chaîne, ce qui serait un gaspillage si la valeur est déjà un nombre.
Merci aux autres articles ici pour avoir fourni d'autres idées d'optimisation!
la source
la source
1.2
. Toujours tester les fonctions numériques avec 0,1 0,2 0,3fonctionne pour tous les cas.
la source
isInt('1')
renvoietrue
comme prévu (au moins pour moi). Assez étrange, bien que, retournetrue
àisInt([5])
aussi bien. Cela n'avait pas d'importance pour moi, mais peut pour vous, alors faites attention.Comme d'autres l'ont mentionné, vous n'avez que des doubles en JS. Alors, comment définissez-vous un nombre étant un entier? Vérifiez simplement si le nombre arrondi est égal à lui-même:
la source
isFloat('abc')
renvoietrue
isFloat(NaN) // true
Celui-ci, ça va?
la source
console.log(isFloat(1.0));
résultats faux.Voici ce que j'utilise pour les entiers:
Bref, sympa :) Fonctionne tout le temps. C'est ce que suggère David Flanagan si je ne me trompe pas.
la source
parseFloat
?Cela dépend vraiment de ce que vous voulez réaliser. Si vous voulez "émuler" des langues fortement typées, je vous suggère de ne pas essayer. Comme d'autres l'ont mentionné, tous les nombres ont la même représentation (le même type).
Utiliser quelque chose comme Claudiu a fourni:
isInteger( 1.0 )
-> vraiqui semble bien pour le bon sens, mais dans quelque chose comme C, vous obtiendrez
false
la source
Tout nombre flottant avec une partie décimale nulle (par exemple 1.0, 12.00, 0.0) est implicitement converti en entier, il n'est donc pas possible de vérifier s'il est flottant ou non.
la source
la source
!!(24.0%1)
est fauxÇa n'a pas besoin d'être si compliqué. La valeur numérique des équivalents parseFloat () et parseInt () d'un entier sera la même. Ainsi, vous pouvez faire comme ça:
alors
Cela permettra également de vérifier les chaînes et n'est donc pas strict. Si vous voulez une solution de type fort (aka, ne fonctionnera pas avec des chaînes):
la source
Je n'ai pas eu de cas où cela n'a pas fait l'affaire.
la source
2
est un entier et23
est considéré comme un deuxième argument de la fonction. En javascript, les décimales sont écrites en utilisant le point comme séparateur - il devrait donc en être ainsi2.23
.CECI EST LE CODE FINAL POUR LA VÉRIFICATION À LA FOIS INT ET FLOTTEUR
OU
la source
la source
C'est aussi simple que:
Essayez ceci dans la console:
Cela déroute beaucoup de gens. Chaque fois que quelque chose est .0, ce n'est plus un flotteur. C'est un entier. Ou vous pouvez simplement l'appeler "une chose numérique" car il n'y a pas de distinction stricte comme à l'époque en C. Bon vieux temps.
Donc, fondamentalement, tout ce que vous pouvez faire est de vérifier l'entier en acceptant le fait que 1.000 est un entier.
Note de côté intéressante
Il y a eu un commentaire sur un nombre énorme. Des nombres énormes signifient AUCUN problème pour cette approche; chaque fois que parseInt est incapable de gérer le nombre (car il est trop grand), il retournera autre chose que la valeur réelle, donc le test retournera FAUX. C'est une bonne chose car si vous considérez quelque chose comme un "nombre", vous vous attendez normalement à ce que JS puisse calculer avec lui - donc oui, les nombres sont limités et parseInt en tiendra compte , pour le dire de cette façon.
Essaye ça:
Dans mon navigateur (IE8), cela renvoie "a est correct; b échoue", ce qui est exactement dû au nombre énorme de b. La limite peut varier mais je suppose que 20 chiffres "devraient suffire à tout le monde", pour citer un classique :)
la source
Number.isInteger
.Number.isInteger
fonctionne. Un test sur une seule ligne estn === (n | 0)
comme indiqué dans une autre réponse.Cette solution a fonctionné pour moi.
la source
Pour les entiers, j'utilise ceci
la source
Dans le script java, tous les nombres sont les
internally 64 bit floating point
mêmes que le double en java. Il n'y a pas de types différents en javascript, tous sont représentés par typenumber
. Vous ne pourrez donc pas faire deinstanceof
chèque. Cependant, vous pouvez utiliser les solutions ci-dessus pour savoir s'il s'agit d'un nombre fractionnaire. les concepteurs de script java ont ressenti avec un seul type qu'ils peuvent éviter de nombreuses erreurs de transtypage.la source
Parfois, les objets Number ne vous permettent pas d'utiliser directement l'opérateur mod (%), si vous êtes confronté à ce cas, vous pouvez utiliser cette solution.
la source
En essayant certaines des réponses ici, j'ai fini par écrire cette solution. Cela fonctionne également avec des nombres à l'intérieur d'une chaîne.
la source
Ce n'est peut-être pas aussi performant que la réponse%, ce qui vous empêche d'avoir à convertir d'abord en chaîne, mais je n'ai encore vu personne la publier, alors voici une autre option qui devrait fonctionner correctement:
la source
Pour les curieux, en utilisant Benchmark.js, j'ai testé les réponses les plus votées (et celle publiée aujourd'hui) sur ce post, voici mes résultats:
la source
Voici mon code. Il vérifie que ce n'est pas une chaîne vide (qui passera autrement), puis la convertit au format numérique. Maintenant, selon que vous voulez que «1.1» soit égal à 1.1, cela peut ou non être ce que vous recherchez.
la source
J'aime cette petite fonction, qui retournera true pour les entiers positifs et négatifs:
Cela fonctionne parce que 1 ou "1" devient "1.0", ce qui isNaN () renvoie false sur (que nous annulons ensuite et retournons), mais 1.0 ou "1.0" devient "1.0.0", tandis que "string" devient "string. 0 ", dont aucun n'est un nombre, donc isNaN () renvoie false (et, encore une fois, est annulé).
Si vous ne voulez que des entiers positifs, il y a cette variante:
ou, pour les entiers négatifs:
isPositiveInt () fonctionne en déplaçant la chaîne numérique concaténée avant la valeur à tester. Par exemple, isPositiveInt (1) a pour résultat que isNaN () évalue "01", ce qui est faux. Pendant ce temps, isPositiveInt (-1) a pour résultat que isNaN () évalue "0-1", ce qui est vrai. Nous nions la valeur de retour et cela nous donne ce que nous voulons. isNegativeInt () fonctionne de la même manière, mais sans annuler la valeur de retour de isNaN ().
Éditer:
Mon implémentation d'origine retournerait également true sur les tableaux et les chaînes vides. Cette implémentation n'a pas ce défaut. Il a également l'avantage de revenir plus tôt si val n'est pas une chaîne ou un nombre, ou s'il s'agit d'une chaîne vide, ce qui le rend plus rapide dans ces cas. Vous pouvez le modifier en remplaçant les deux premières clauses par
si vous souhaitez uniquement faire correspondre les nombres littéraux (et non les chaînes)
Éditer:
Je ne peux pas encore poster de commentaires, alors j'ajoute ceci à ma réponse. L'indice de référence publié par @Asok est très informatif; cependant, la fonction la plus rapide ne correspond pas aux exigences, car elle renvoie également TRUE pour les flottants, les tableaux, les booléens et les chaînes vides.
J'ai créé la suite de tests suivante pour tester chacune des fonctions, en ajoutant également ma réponse à la liste (fonction 8, qui analyse les chaînes, et fonction 9, qui ne le fait pas):
J'ai également relancé le benchmark avec la fonction # 8 ajoutée à la liste. Je ne publierai pas le résultat, car ils sont un peu gênants (par exemple, cette fonction n'est PAS rapide) ...
Les résultats (abrégés - j'ai supprimé les tests réussis, car la sortie est assez longue) sont les suivants:
J'ai laissé des échecs pour que vous puissiez voir où chaque fonction échoue et les tests (chaîne) '#' pour que vous puissiez voir comment chaque fonction gère les valeurs entières et flottantes dans les chaînes, car certains peuvent vouloir que ces analyses soient analysées en tant que nombres et d'autres Peut-être pas.
Sur les 10 fonctions testées, celles qui correspondent réellement aux exigences de l'OP sont [1,3,5,6,8,9]
la source
Condition de validation flottante:
Condition pour la validation entière:
J'espère que cela pourrait être utile.
la source
Vous pouvez ajouter
typeof a === 'number'
si vous souhaitez exclure des chaînes.la source