325 votes

Convertir NaN en 0 en javascript

Existe-t-il un moyen de convertir les valeurs NaN en 0 sans instruction if ?

if (isNaN(a)) a = 0;

Il est très ennuyeux de devoir vérifier mes variables à chaque fois.

762voto

user113716 Points 143363

Vous pouvez le faire :

a = a || 0

...qui convertira une valeur "fausse" en 0 .

Les valeurs "fausses" sont :

  • false
  • null
  • undefined
  • 0
  • "" ( chaîne vide )
  • NaN ( Pas un numéro )

Ou ceci si vous préférez :

a = a ? a : 0;

...ce qui aura le même effet que ci-dessus.


EDIT :

Si l'intention était de tester plus que le simple NaN alors vous pouvez faire la même chose, mais faites un àNuméro la conversion d'abord.

a = +a || 0

Cela utilise l'opérateur unaire + pour essayer de convertir a à un numéro. Cela présente l'avantage supplémentaire de convertir des choses comme les chaînes numériques '123' à un numéro.

La seule chose inattendue peut être si quelqu'un passe un tableau qui peut être converti avec succès en un nombre :

+['123']  // 123

Ici nous avons un tableau qui a un seul membre qui est une chaîne numérique. Il sera converti avec succès en un nombre.

48voto

WickyNilliams Points 2275

Utilisation d'un double-tilde (double bitwise NOT) - ~~ - fait des choses intéressantes en JavaScript. Par exemple, vous pouvez l'utiliser à la place de Math.floor ou même comme alternative à parseInt("123", 10) ! Cette méthode a été largement discutée sur le web, je ne vais donc pas expliquer pourquoi elle fonctionne ici, mais si cela vous intéresse : Qu'est-ce que l'opérateur "double tilde" (~~) en JavaScript ?

Nous pouvons exploiter cette propriété d'une double-tilde pour convertir NaN à un nombre, et heureusement ce nombre est zéro !

console.log(~~NaN); // 0

31voto

Saket Points 9771

Écrivez votre propre méthode, et utilisez-la partout où vous voulez une valeur numérique :

function getNum(val)
{
   if (isNaN(val)) 
     return 0;
   else
     return val;
}

4voto

Chuck Kollars Points 884

Plutôt que d'y remédier pour pouvoir continuer, pourquoi ne pas revenir en arrière et se demander pourquoi vous vous heurtez à un NaN en premier lieu ?

Si l'une des entrées numériques d'une opération est NaN, la sortie sera également NaN. C'est ainsi que fonctionne la norme actuelle de l'IEEE sur la virgule flottante (ce n'est pas seulement Javascript). Ce comportement s'applique à un bonne raison : l'intention sous-jacente est de vous empêcher d'utiliser un résultat bidon sans vous en rendre compte.

Le principe de fonctionnement de NaN est le suivant : si quelque chose ne va pas dans une sous-sous-sous-opération (produisant un NaN à ce niveau inférieur), le résultat final sera le suivant également est NaN, ce que vous reconnaîtrez immédiatement comme une erreur même si votre logique de gestion des erreurs (throw/catch peut-être ?) n'est pas encore complète.

NaN comme résultat d'un calcul arithmétique toujours indique que quelque chose a mal tourné dans les détails de l'arithmétique. C'est une façon pour l'ordinateur de dire "il faut déboguer ici". Plutôt que de trouver un moyen de continuer quand même avec un nombre qui n'est presque jamais correct (est-ce que 0 est vraiment ce que vous voulez ?), pourquoi ne pas trouver le problème et le corriger.

Un problème courant en Javascript est que les deux parseInt(...) et parseFloat(...) retournera NaN si on lui donne un argument non sensé ( null , '' etc). Réglez le problème au niveau le plus bas possible plutôt qu'à un niveau supérieur. Ainsi, le résultat du calcul global a de bonnes chances d'avoir un sens, et vous ne substituez pas un nombre magique (0 ou 1 ou autre) au résultat de l'ensemble du calcul. (L'astuce de (parseInt(foo.value) || 0) ne fonctionne que pour les sommes, pas pour les produits - pour les produits, vous voulez que la valeur par défaut soit 1 plutôt que 0, mais pas si la valeur spécifiée est réellement 0).

Peut-être que pour faciliter le codage, vous voulez une fonction qui récupère une valeur de l'utilisateur, la nettoie et fournit une valeur par défaut si nécessaire, comme ceci :

function getFoobarFromUser(elementid) {
        var foobar = parseFloat(document.getElementById(elementid).innerHTML)
        if (isNaN(foobar)) foobar = 3.21;       // default value
        return(foobar.toFixed(2));
}

0voto

Conti Points 11

La réponse la plus populaire a fonctionné pour moi, et vous pouvez également le mélanger avec de multiples opérations arithmétiques, comme par exemple :

(((400-200)*100)/750 || 0).toFixed(1);

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