348 votes

Comment transformer le NaN de parseInt en 0 pour une chaîne vide ?

Est-il possible, d'une manière ou d'une autre, de renvoyer 0 au lieu de NaN lors de l'analyse des valeurs en JavaScript ?

En cas de chaîne vide parseInt renvoie à NaN .

Est-il possible de faire quelque chose comme ça en JavaScript pour vérifier si NaN ?

var value = parseInt(tbb) == NaN ? 0 : parseInt(tbb)

Ou peut-être existe-t-il une autre fonction ou un plugin jQuery qui peut faire quelque chose de similaire ?

77 votes

FYI, NaN != NaN . Vous auriez besoin isNaN(value) .

38 votes

Oui, il n'y a pas deux nounous identiques ;)

3 votes

Fonction d'appel parseInt() deux fois (dans les cas de réussite/non normal NaN ) n'est jamais une bonne idée. En dehors de l'inefficacité, pour le non averti, si ce qui passe pour de la tbb est un appel de fonction avec des effets secondaires, c'est terrible. Je n'utiliserais aucune solution ici lorsque je vois parseInt() deux fois.

885voto

Matt Points 4882
var s = '';

var num = parseInt(s) || 0;

Lorsqu'il n'est pas utilisé avec des valeurs booléennes, le OU logique ( || ) renvoie la première expression ( parseInt(s) ) si elle peut être évaluée comme vraie, sinon elle renvoie la deuxième expression (0). La valeur de retour de parseInt('') est NaN. NaN est évalué à false, donc num finit par être fixé à 0.

7 votes

Cela ne fonctionnera pas si s="4s" ; (cela renvoie 4...ce qui est incorrect...)

1 votes

Fonction parseInt en js pour analyser n'importe quel nombre dans une chaîne de caractères.

36 votes

@markzzz Relisez la question. Le PO demande : " Est-il possible de renvoyer 0 au lieu de NaN ? ". L'OP ne veut pas vérifier si une chaîne particulière est analysable en int. L'OP veut obtenir 0 au lieu de NaN . Le code de Matt résout parfaitement ce problème.

60voto

gprasant Points 2124

Vous pouvez également utiliser le isNaN() función:

var s = ''
var num = isNaN(parseInt(s)) ? 0 : parseInt(s)

13 votes

Pourquoi appeler parseInt(s) deux fois ? En outre, il devrait être parseInt(s, 10)

3 votes

@GeorgeJempty Un radix de "10" est utilisé par défaut ; ce paramètre est facultatif. Bon point sur l'appel parseInt() deux fois cependant.

14 votes

@AutumnLeonard c'est seulement un peu vrai. Si votre chaîne commence par un 0, il suppose que le nombre est au format octal, donc parseInt('077') vous donne 63. Cela peut conduire à des bogues très désagréables à trouver, c'est pourquoi vous devriez toujours spécifier le deuxième paramètre. voir par exemple stackoverflow.com/questions/8763396/

25voto

Chris Werner Points 91

J'ai été surpris de ne voir personne mentionner l'utilisation Number() . Il est vrai qu'il analysera les décimales si elles sont fournies, et agira donc différemment de l'option parseInt() Cependant, il suppose déjà la base 10 et transformera "" ou même " " en 0.

1 votes

Oui, très pratique pour lire à partir du LocalStorage : Nombre(localStorage.getItem('appBanner.count')) + 1

1 votes

Bien que cela fonctionne pour la question telle qu'elle a été posée, cela renvoie toujours NaN pour les caractères non numériques et sans espace.

3voto

pimvdb Points 66332

Pourquoi ne pas remplacer la fonction ? Dans ce cas, vous pouvez toujours être sûr qu'elle retourne 0 en cas de NaN :

(function(original) {
    parseInt = function() {
        return original.apply(window, arguments) || 0;
    };
})(parseInt);

Maintenant, n'importe où dans votre code :

parseInt('') === 0

15 votes

Le fait de remplacer la fonction de cette manière pourrait perturber les programmeurs JavaScript experts qui pourraient y voir un bogue. Votre fonction surchargée sera probablement enterrée quelque part où elle ne sera pas vue. C'est créatif, mais je ne suis pas sûr que je le recommanderais personnellement, vu la facilité avec laquelle il est possible d'ajouter une balise || 0 comme dans la réponse de Matt. Je considère le remplacement d'objets que vous ne possédez pas comme un dernier recours ou lorsque le fait de ne pas le faire coûterait beaucoup plus cher en termes de temps et de complexité.

2 votes

Je suis d'accord avec @jmort253... C'est dangereux car la fonction est trop intelligente. Il est préférable de faire exactement la même fonction mais avec un nom comme getSafeNumberValue ou quelque chose comme ça.

1voto

Schroedingers Cat Points 2383

Faites une vérification séparée pour une chaîne vide (car c'est un cas spécifique) et mettez-la à zéro dans ce cas.

Vous pourriez ajouter "0" au début, mais il faudrait alors ajouter un préfixe pour indiquer qu'il s'agit d'un nombre décimal et non octal.

0 votes

Vous pensez donc qu'il est préférable d'ajouter 0 si vide ?

1 votes

Non - c'est une approche que j'ai utilisée. Dans ce cas, un contrôle séparé serait préférable. Cependant, si la solution de Matts fonctionne, c'est encore plus propre.

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