Comprendre les nombres et devises internationaux
Argent local expliqué !
- Argent : Localisation (L10n) et Internationalisation (i18n)
- Concepts critiques
- Une solution
- Prochaines étapes
Argent : Localisation (L10n) et Internationalisation (i18n)
Ce ne sont pas seulement des mots pour dominer une partie de Scrabble, la localisation et l’internationalisation désignent le processus qui rend un produit à l’aise dans un autre pays.
Afficher une devise dans le mauvais format local est un indice évident : vous n’avez fourni aucun effort.
Si vous ne pouvez pas formater un prix, comment pourriez‑vous gérer la livraison ?
L’internationalisation est un sujet vaste, couvrant tout, de la traduction de texte au formatage des dates. Dans cet article, nous nous concentrerons sur un sous‑domaine particulier, le formatage des nombres et des devises.
Examinons le formatage dans trois pays de la zone euro, aux États‑Unis et en Inde :
€1,234,567.89Irlande 🇮🇪1.234.567,89 €Allemagne 🇩🇪1 234 567,89 €France 🇫🇷$1,234,567.89États‑Unis 🇺🇸₹12,34,567.89Inde 🇮🇳
Chaos ! N’est‑ce pas le cas ? Il y a des symboles, des espaces et de la ponctuation partout ! C’est incroyable de voir à quel point l’UE peut s’entendre sur quoi que ce soit ! 😅
Concepts critiques
Avant de plonger dans les solutions, que veut‑on dire par « Les nombres sont locaux » ?
Les nombres sont locaux 🏘️
Chaque locale (Country per ISO 3166) définit des règles de formatage des nombres.
Les règles de formatage des nombres comprennent :
- Décimal : virgule, point.
- Milliers : virgule, point, espace.
- Position et espacement du symbole monétaire.
La monnaie est globale 🌎
Une currency désigne une unité monétaire spécifique. (Voir ISO 4217 pour la liste.)
- Définit un symbole :
$,€,£,¥. (Souvent réutilisé.) - Possède toujours un code à 3 lettres :
USD,EUR,GBP,JPY. - Peut être utilisée/échangée dans « n’importe quel » pays. En théorie.
- Convertir d’une monnaie à l’autre nécessite des données de taux de change.
- Sa valeur ne varie pas selon la locale.
Quand la locale compte
La plupart des API REST de commerce électronique/paiement manipulent price + currencyCode. Pourquoi aucune locale ?
Les locales sont (généralement) définies au niveau du système d’exploitation ou de l’appareil, et les navigateurs les exposent via navigator.language. Étant donné que chacun de vos utilisateurs peut avoir une locale différente, il n’est logique de formater les nombres et les devises que côté client.
Une solution
Bonne nouvelle ! Les langages de programmation modernes intègrent ce support. En JavaScript, on dispose de la classe Intl et de Intl.NumberFormat !
Voyons un exemple de code :
const number = 1_234_567.89;
/** * Formate un nombre en devise locale. * @param {number} amount - Le montant à formater. * @param {string} currency - Le code devise à 3 lettres. * @param {string} [locale] - La chaîne de locale de l'utilisateur. */const formatMoney = (amount, currency, locale = navigator.language) => new Intl.NumberFormat(locale, { currency, style: 'currency' }) .format(amount);
console.log('🇩🇪 ' + formatMoney(number, 'EUR', 'de-DE'));console.log('🇮🇪 ' + formatMoney(number, 'EUR', 'ga-IE'));console.log('🇫🇷 ' + formatMoney(number, 'EUR', 'fr-FR'));Si vous devez réaliser des opérations plus complexes, comme calculer des taxes, appliquer des remises ou convertir entre devises, il est recommandé d’utiliser une bibliothèque telle que dinero.js.
Prochaines étapes
Selon vos besoins spécifiques, vous pourriez vouloir explorer des concepts connexes :
- Bonnes pratiques avec la locale utilisateur. Détecter + permettre des surcharges. (par ex. un menu déroulant de pays.)
- Persister des entiers complets (stockez les centimes, pas les dollars.)
- Calculs monétaires. (par ex. appliquer un coupon de
20 % de réduction, calculersubTotal + taxes, etc.) - Taux de change en temps réel. (Pour les achats au détail, échanges forex/devises.)
Faites‑moi savoir si vous souhaitez voir un futur article sur ces sujets !
JavaScript / TypeScript
- dinero.js prend en charge les opérations monétaires, les taux de change, le formatage et l’analyse !
Rust
- rusty_money est ma bibliothèque Rust préférée.
Go
- currency est mon choix actuel pour Golang.