Entender números y monedas internacionales
Dinero localizado explicado
- Dinero: Localización (L10n) e Internacionalización (i18n)
- Conceptos Críticos
- Una solución
- Próximos pasos
Dinero: Localización (L10n) e Internacionalización (i18n)
No son solo para dominar una partida de Scrabble; localización e internacionalización se refieren al proceso de hacer que un producto se sienta en casa en otro país.
Mostrar una moneda con un formato local incorrecto es una señal inequívoca: no has hecho ningún esfuerzo.
Si no sabes formatear un precio, ¿cómo podrías gestionar el envío?
La internacionalización es un tema amplio que abarca desde la traducción de texto hasta el formato de fechas. En este artículo nos centraremos en un subtema concreto: el formato de números y monedas.
Analicemos el formato entre tres países de la zona euro, Estados Unidos e India:
€1,234,567.89Irlanda 🇮🇪1.234.567,89 €Alemania 🇩🇪1 234 567,89 €Francia 🇫🇷$1,234,567.89EE. UU. 🇺🇸₹12,34,567.89India 🇮🇳
¡Caos! ¿Verdad? Símbolos, espacios en blanco y puntuación por todos lados. Es impresionante cómo la UE logra ponerse de acuerdo en algo. 😅
Conceptos Críticos
Antes de entrar en las soluciones, ¿qué significa exactamente “Los números son locales”?
Los números son locales 🏘️
Cada configuración regional (Códigos de país ISO 3166) define las reglas para dar formato a los números.
Las reglas de formato numérico incluyen:
- Decimal: coma, punto.
- Miles: coma, punto, espacio.
- Posición y espaciado del símbolo de moneda.
La moneda es global 🌎
Una currency hace referencia a una unidad monetaria específica. (Consulta ISO 4217 para ver la lista.)
- Define un símbolo:
$,€,£,¥. (A menudo reutilizado.) - Siempre cuenta con un código de tres letras:
USD,EUR,GBP,JPY. - Puede utilizarse o intercambiarse en “cualquier” país. En teoría.
- La conversión entre monedas requiere datos de tipos de cambio.
- El valor no se modifica según la configuración regional.
Cuándo importa la configuración regional
La mayoría de las APIs REST de e-commerce o pagos manejan price + currencyCode. ¿Por qué no se incluyen los locales?
Los locales se definen (por lo general) a nivel del sistema operativo o dispositivo, y los navegadores los exponen mediante navigator.language. Dado que cada usuario puede tener una configuración regional distinta, formatear números y monedas en el cliente es la única opción sensata.
Una solución
Buena noticia: los lenguajes de programación modernos incluyen soporte nativo para esto. En JavaScript, contamos con la clase Intl y Intl.NumberFormat.
Veamos el código:
const number = 1_234_567.89;
/** * Format a number in local currency. * @param {number} amount - The amount to format. * @param {string} currency - The 3-letter currency code. * @param {string} [locale] - The users locale string. */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 necesitas operaciones más complejas, como calcular impuestos, aplicar descuentos o convertir entre monedas, te convendrá usar una librería como dinero.js.
Próximos pasos
Según tus necesidades específicas, te convendrá explorar conceptos relacionados:
- Buenas prácticas con la configuración regional del usuario. Detectar + permitir anulaciones. (p. ej., un selector de país.)
- Persistencia de enteros (almacenar centavos, no dólares.)
- Operaciones monetarias. (p. ej., aplicar un cupón de
20% de descuento, calcularsubTotal + impuestos, etc.) - Tasas de cambio en tiempo real. (Para compras minoristas, divisas o intercambios de moneda.)
¡Avísame si te gustaría ver un artículo futuro sobre estos temas!