Quoi de plus simple, a priori, que de convertir un texte en nombre en JavaScript ? Souvent, on n’a même pas l’impression d’en avoir besoin. Et sinon, on recourt à parseInt ou parseFloat, vite fait…

Et pourtant… Que de pièges, que de subtilités de fonctionnement nous attendent sur un sujet au premier abord aussi basique. Cet article fait le point.

Commentaires

Je vais être un peu rude mais ça devient subtil qu'à partir du moment où on écarte les manières évidentes de le faire.

Comme je l'ai remarqué dans les commentaires du blog, pour convertir une chaîne en nombre l'utilisation de la fonction Number est bien plus intuitive. Pour convertir une chaîne en nombre arrondi, je pense que les méthodes Math.floor/Math.ceil/Math.round sont elles aussi plus appropriées.

Il y a plus de 5 ans

Salut,

J'ai répondu à ces remarques en commentaire sur le blog également. S'il existe des tas de cas où floor/ceil/round seront tout aussi utiles, il y en a d'autres où on voudra effectivement la troncature (équivalent de parseInt en contexte valide), ce qui n'est plus aussi simple avec les arrondis.

Quant à déterminer qui du + unaire ou de Number(…) est le plus intuitif, je pense qu'il s'agit de quelque chose de très subjectif, les deux ayant très exactement le même effet : on en est réduits à la syntaxe. Votre commentaire a le mérite de rappeler cette syntaxe, qui est certes un peu plus explicite mais plus verbeuse.

Il y a plus de 5 ans

> il y en a d'autres où on voudra effectivement la troncature ce qui n'est plus aussi simple avec les arrondis

Franchement, je ne vois pas en quoi la fonction ci-dessous est plus compliquée que celle que vous proposez. Son seul défaut est d'être plus verbeuse mais plus facile à comprendre et maintenir. Il est plus facile de trouver de la doc sur les APIs utilisées que de regarder les specs d'ECMAScript.

function cleanInt(x) {
x = Number(x);
return x > 0 ? Math.floor(x) : Math.ceil(x);
}

Le message que je veux faire passer est que je trouve dommage, dans ce genre d'article, de ne pas commencer par voir ces APIs. Ensuite, seulement, on pourrait nous présenter la version rapide et optimisée "à l'octet prêt" (au détriment de la lisibilité).

Il y a plus de 5 ans

Bonjour,

Je suis désolé que l'article ne vous satisfasse pas, et je comprends aussi votre approche. Elle est intéressante et certes lisible, je vais peut-être mettre à jour mon texte. Il est certain que la doc des API est plus accessible que la spec, en particulier pour les versions avant ES5.

D'un point de vue perfs pures, la version à base de "+" et, surtout, de "| 0", est probablement un chouilla plus rapide, mais dans un contexte qui est probablement lié à une saisie utilisateur, on est de toutes façons en train de compter les nanosecondes alors que l'échelle pertinente ne descend pas sous le centième, voire le dixième, de secondes, donc bon…

Quant à votre fonction, elle se prête particulièrement bien à une légère opti d'écriture, qui la rend encore plus concise sans perdre de sa lisibilité :

function cleanInt(x) {
x = Number(x);
return Math[x >= 0 ? 'floor' : 'ceil'](x);
}

Cordialement,

Il y a plus de 5 ans

Franchement, à titre purement personnel, l'article ne me déplaît pas. Il donne de bonnes explications sur la conversion implicite en Number. Je me dis juste que, suite à la lecture de l'article, le débutant en JavaScript pourrait trouver que convertir un nombre en chaîne, ça n'est pas simple. Alors qu'en fait ça n'est pas compliqué dès lors qu'on écarte les fonctions parseFloat et parseInt.

J'avais volontairement écarté l'optimisation d'écriture de la fonction pour améliorer sa lisibilité car je pars du principe que quelqu'un qui lit ce genre d'article ne sait pas forcement que l'on peut utiliser la syntaxe [] pour faire référence à une propriété d'objet. Peut-être ai-je tort...

Quoi qu'il en soit, merci d'avoir pris la peine d'échanger sur ce ce sujet.

Il y a plus de 5 ans

Hum "nombre en chaîne" est à remplacer par "chaîne en nombre" :p

Il y a plus de 5 ans

check_ca : j'ai pris un moment ce matin pour compléter l'article sur base de nos échanges.

Il y a plus de 5 ans

Merci et bonnes fêtes ! :)

Il y a plus de 5 ans
Vous devez vous inscrire ou vous connecter pour poster un commentaire