Mostrar nombres y símbolos de monedas

Mostrar información de monedas de forma localizada

Problema

Una aplicación necesita hacer referencia a una moneda, como 'USD'. Simplemente mostrar este código es críptico. Mostrar el nombre completo 'US Dollar' es mejor, pero este nombre en sí mismo necesita ser traducido ('dólar estadounidense', 'Dollar américain'). Además, el símbolo correcto ($, US$, CA$) puede ser ambiguo sin contexto.

Solución

Usa el componente FormattedNumber de react-intl con la opción currencyDisplay. Esto te permite mostrar una moneda como su símbolo (por defecto), su nombre completo localizado o su código ISO, todo correctamente formateado para la configuración regional actual.

Pasos

1. Crear un componente cliente para mostrar monedas

El componente FormattedNumber debe usarse dentro de un componente cliente. Crea un archivo app/components/LocalizedCurrency.tsx que tome la opción currencyDisplay como prop para hacerlo reutilizable.

// app/components/LocalizedCurrency.tsx
'use client';

import { FormattedNumber } from 'react-intl';

type Props = {
  value: number;
  currency: string;
  displayAs: 'symbol' | 'name' | 'code';
};

export default function LocalizedCurrency({
  value,
  currency,
  displayAs,
}: Props) {
  return (
    <FormattedNumber
      value={value}
      style="currency"
      currency={currency}
      currencyDisplay={displayAs}
    />
  );
}

Este componente ahora acepta un prop displayAs que controla directamente la opción currencyDisplay.

2. Usar el componente en una página

Ahora puedes usar este componente en una página para mostrar los diferentes formatos de moneda cambiando el prop displayAs.

// app/[lang]/page.tsx
import LocalizedCurrency from '@/app/components/LocalizedCurrency';

export default function Home() {
  const price = 1250.75;
  const currency = 'USD';

  return (
    <div>
      <h1>Currency Display Options</h1>
      <p>
        Default (symbol):
        <LocalizedCurrency
          value={price}
          currency={currency}
          displayAs="symbol"
        />
      </p>
      <p>
        Full name (name):
        <LocalizedCurrency
          value={price}
          currency={currency}
          displayAs="name"
        />
      </p>
      <p>
        ISO code (code):
        <LocalizedCurrency
          value={price}
          currency={currency}
          displayAs="code"
        />
      </p>
    </div>
  );
}

Al visitar /en, verás "1,250.75 US dollars" para la opción 'name'. Al visitar /es, la misma línea se mostrará como "1.250,75 dólares estadounidenses", mostrando que el nombre de la moneda en sí ha sido traducido y formateado correctamente.