DanLevy.net

Entender números y monedas internacionales

Dinero localizado explicado

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:

¡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:

La moneda es global 🌎

Una currency hace referencia a una unidad monetaria específica. (Consulta ISO 4217 para ver la lista.)

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:

¡Avísame si te gustaría ver un artículo futuro sobre estos temas!