Comment ajouter des virgules lors du formatage des nombres en JavaScript ? Guide détaillé
\n\nVous êtes-vous déjà demandé pourquoi 1000000 est difficile à lire, alors que 1,000,000 se lit instantanément ? L'œil humain n'est tout simplement pas conçu pour les longues séries de chiffres. Les séparateurs de milliers (virgules, espaces ou points) ne sont pas qu'une question d'esthétique, mais une question d'utilisabilité et de perception de l'information.
\n\nSi vous codez en JavaScript et travaillez avec des prix, des statistiques, des identifiants ou toute donnée numérique, tôt ou tard la question se posera : « Comment formater un nombre en ajoutant des virgules ou des espaces entre les milliers ? ». Sur Stack Overflow, cette question a recueilli des milliers de vues, ce qui montre qu'elle préoccupe beaucoup de monde.
\n\nDans cet article, nous ne nous contenterons pas de vous donner du code prêt à l'emploi. Nous analyserons trois méthodes principales : de l'API moderne intégrée aux expressions régulières classiques. Vous apprendrez à faire en sorte que JavaScript « parle » le langage des nombres lisibles. C'est parti !
\n\nPourquoi un simple nombre est-il un problème ?
\n\nImaginez que vous affichez sur un site : Prix : 1234567.89 €. L'œil bute. Combien cela fait-il ? Un million ? Douze millions ? Si vous ajoutez des virgules : 1,234,567.89 — c'est immédiatement clair : un peu plus d'un million.
En JavaScript, un nombre est simplement un Number. Il n'a pas de « format d'affichage » intégré. Tout ce que nous voyons est le résultat de sa conversion en chaîne de caractères. Et c'est là que nous, développeurs, entrons en jeu.
\n\nMéthode 1 : toLocaleString() — le roi de la simplicité
\n\nLa méthode la plus élégante et moderne consiste à utiliser toLocaleString(). Elle est disponible pour tout nombre en JavaScript et permet de prendre en compte la locale de l'utilisateur.
const number = 1234567.89;\nconst formatted = number.toLocaleString('ru-RU');\nconsole.log(formatted); // "1 234 567,89"\n\n\nRemarque : pour la locale russe (ru-RU), le séparateur de milliers est un espace insécable, et le séparateur décimal est une virgule. Pour la locale américaine (en-US), ce sont la virgule et le point :
console.log(number.toLocaleString('en-US')); // "1,234,567.89"\n\n\nAvantages :
\n- \n
- Code minimal. \n
- Respecte les normes locales (espaces, points, virgules). \n
- Fonctionne dans tous les navigateurs modernes et Node.js. \n
Inconvénients :
\n- \n
- Moins de contrôle sur le format (impossible de remplacer simplement un espace par une virgule sans manipulations supplémentaires). \n
- Les anciens navigateurs (IE11) peuvent ne pas prendre en charge le second argument (locales). \n
Méthode 2 : Intl.NumberFormat — flexibilité et puissance
\n\nSi vous avez besoin d'un contrôle total, utilisez l'objet Intl.NumberFormat. C'est le même mécanisme que toLocaleString(), mais avec des options avancées.
const formatter = new Intl.NumberFormat('ru-RU', {\n style: 'decimal',\n useGrouping: true, // Active les séparateurs de milliers\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n});\n\nconsole.log(formatter.format(1234567.8)); // "1 234 567,80"\n\n\nVous voulez une devise ? Facile :
\n\nconst currencyFormatter = new Intl.NumberFormat('ru-RU', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0\n});\nconsole.log(currencyFormatter.format(1000000)); // "1 000 000 $"\n\n\nPeut-on changer manuellement le séparateur de milliers ? Il n'y a pas d'option directe, mais on peut utiliser replace :
\n\nlet result = formatter.format(1234567.89);\nresult = result.replace(/\\s/g, ','); // Remplace les espaces par des virgules\nconsole.log(result); // "1,234,567,80"\n\n\nAvantages :
\n- \n
- Flexibilité maximale (devise, pourcentages, unités de mesure). \n
- Performance (on peut le créer une fois et le réutiliser). \n
Inconvénients :
\n- \n
- Un peu plus de code que toLocaleString(). \n
- Toujours dépendant de la locale. \n