显示货币名称和符号

以本地化方式展示货币信息

问题

应用程序需要引用一种货币,例如 “USD”。仅显示该代码会让用户感到困惑。显示完整名称 “US Dollar” 更好,但这个名称本身也需要被翻译(如 “美元”、“dólar estadounidense”、“Dollar américain”)。此外,正确的符号($、US$、CA$)在没有上下文时也可能产生歧义。

解决方案

请使用 FormattedNumber 组件(来自 react-intl),并结合 currencyDisplay 选项。这样可以将货币以符号(默认)、本地化全名或 ISO 代码的形式显示,并且会根据当前语言环境正确格式化。

步骤

1. 创建用于货币显示的客户端组件

必须在客户端组件中使用 FormattedNumber 组件。创建一个 app/components/LocalizedCurrency.tsx 文件,并将 currencyDisplay 选项作为 prop 传入,以实现复用。

// 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}
    />
  );
}

该组件现在支持一个 displayAs prop,可直接控制 currencyDisplay 选项。

2. 在页面中使用该组件

现在可以在页面中使用该组件,通过更改 displayAs prop 来展示不同的货币格式。

// 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>
  );
}

当访问 /en 时,'name' 选项会显示为 “1,250.75 美元”。访问 /es 时,同一行会显示为 “1.250,75 美元”,这表明货币名称已被正确翻译和格式化。