84 votes

Déterminer si la valeur JavaScript est un "integer" ?

Duplicata possible :
Vérifier si une variable contient une valeur numérique en Javascript ?

Comment vérifier si une variable est un nombre entier dans jQuery ?

Exemple :

if (id == int) { // Do this }

J'utilise ce qui suit pour obtenir l'ID à partir de l'URL.

var id = $.getURLParam("id");

Mais je veux vérifier si la variable est un nombre entier.

18 votes

Le "duplicate" vérifie s'il s'agit d'une numérique mais pas s'il s'agit d'une valeur numérique intégral valeur. Subtilement différent.

2 votes

+1 Il ne s'agit pas d'un doublon, bien que les informations contenues dans l'autre numéro soient intéressantes et pertinentes. Une valeur numérique n'est pas nécessairement un nombre entier.

206voto

bardiir Points 5225

Essayez ça :

if(Math.floor(id) == id && $.isNumeric(id)) 
  alert('yes its an int!');

$.isNumeric(id) vérifie s'il s'agit d'une valeur numérique ou non
Math.floor(id) == id déterminera alors si c'est vraiment une valeur entière et non un float. S'il s'agit d'un flottant, l'analyser en int donnera un résultat différent de la valeur originale. Si c'est un int, les deux seront identiques.

1 votes

J'aime aussi cette approche, et j'ai donné une note positive.

0 votes

Cela échouera subtilement si vous utilisez l'option Number type (ce qui est rare, mais possible)

0 votes

@pst je ne pense pas que vous ayez une Number dans une variable sans que vous le sachiez, mais oui, cela pourrait ne pas être parfaitement sûr

49voto

Aadit M Shah Points 17951

Voici un polyfill pour le Number fonctions de prédicat :

"use strict";

Number.isNaN = Number.isNaN ||
    n => n !== n; // only NaN

Number.isNumeric = Number.isNumeric ||
    n => n === +n; // all numbers excluding NaN

Number.isFinite = Number.isFinite ||
    n => n === +n               // all numbers excluding NaN
      && n >= Number.MIN_VALUE  // and -Infinity
      && n <= Number.MAX_VALUE; // and +Infinity

Number.isInteger = Number.isInteger ||
    n => n === +n              // all numbers excluding NaN
      && n >= Number.MIN_VALUE // and -Infinity
      && n <= Number.MAX_VALUE // and +Infinity
      && !(n % 1);             // and non-whole numbers

Number.isSafeInteger = Number.isSafeInteger ||
    n => n === +n                     // all numbers excluding NaN
      && n >= Number.MIN_SAFE_INTEGER // and small unsafe numbers
      && n <= Number.MAX_SAFE_INTEGER // and big unsafe numbers
      && !(n % 1);                    // and non-whole numbers

Tous les principaux navigateurs prennent en charge ces fonctions, sauf isNumeric qui n'est pas dans la spécification parce que je l'ai inventé. Ainsi, vous pouvez réduire la taille de ce polyfill :

"use strict";

Number.isNumeric = Number.isNumeric ||
    n => n === +n; // all numbers excluding NaN

Alternativement, il suffit de mettre en ligne l'expression n === +n manuellement.

1 votes

Vous devez toujours passer le radix dans parseInt . Essayez "08" dans votre solution. parseInt(n, 10)

0 votes

@Hemlock - Techniquement isInt doit toujours retourner false lorsqu'on lui passe une chaîne comme "08" puisqu'il ne s'agit pas d'une valeur numérique. Cependant, ma fonction renvoie true lorsqu'on lui passe une chaîne comme "5" . En plus de votre argument selon lequel parseInt doit toujours passer un paramètre radix m'a fait prendre la résolution de réécrire ma fonction. Maintenant, j'utilise l'expression +n === n && !(n % 1) pour vérifier si un nombre est un entier ou non. Comme auparavant, il fonctionne pour tous les cas de test numériques. Cependant, il filtre maintenant aussi les chaînes de caractères (ce qui est ce que vous voulez). Ainsi, il n'y a pas de problème de base dans laquelle le nombre est représenté.

0 votes

@AaditMShah Merci ! Cela sera très utile.

30voto

Marc Points 4418

Utilisez la méthode IsNumeric de jQuery.

http://api.jquery.com/jQuery.isNumeric/

if ($.isNumeric(id)) {
   //it's numeric
}

CORRECTION : cela ne garantirait pas un entier . Ce serait :

if ( (id+"").match(/^\d+$/) ) {
   //it's all digits
}

Bien sûr, cela n'utilise pas jQuery, mais je suppose que jQuery n'est pas obligatoire tant que la solution fonctionne.

0 votes

Ce sera également le cas pour les valeurs non-int. $.isNumeric(3.14) => true

0 votes

@bardiir, merci. Je m'en suis rendu compte un moment avant que vous ne postiez et je l'ai mis à jour.

0 votes

Je suis maintenant un peu curieux de savoir ce qui serait le plus rapide, une expression régulière comme votre suggestion ou un type-casting comme dans la mienne :D

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X