Preise formatieren
Lokalisierte Währungs- und Zahlenformate anzeigen
Problem
Die Anzeige eines Preises umfasst sowohl eine Zahl als auch eine Währung. Ein US-Preis ist $1,200.50, während derselbe Wert in Euro in Deutschland 1 200,50 € sein könnte. Die Position des Währungssymbols, das Dezimaltrennzeichen und das Tausendertrennzeichen ändern sich alle, und das Hardcodieren dieser Regeln für jede Sprache ist nicht handhabbar.
Lösung
Verwenden Sie die FormattedNumber-Komponente aus react-intl mit der style: 'currency'-Option. Diese Komponente liest die aktuelle Locale aus ihrem Provider und formatiert eine Zahl als Preis, wobei Symbolplatzierung, Dezimaltrennzeichen und Tausendertrennung für diese Locale und die angegebene Währung automatisch verarbeitet werden.
Schritte
1. Client-Komponente für Preise erstellen
Formatierungskomponenten aus react-intl müssen innerhalb von Client-Komponenten verwendet werden.
Erstellen Sie eine neue Komponente, app/components/ProductPrice.tsx.
// app/components/ProductPrice.tsx
'use client';
import { FormattedNumber } from 'react-intl';
type Props = {
price: number;
currencyCode: string; // e.g., "USD", "EUR", "JPY"
};
export default function ProductPrice({ price, currencyCode }: Props) {
return (
<FormattedNumber
value={price}
style="currency"
currency={currencyCode}
/>
);
}
2. Formatierungsoptionen übergeben
Die FormattedNumber-Komponente wird durch diese Props gesteuert:
value: Der numerische Wert des Preises.style: 'currency': Dies weist die Komponente an, die Zahl als Währung zu formatieren, nicht als Standard-Dezimalzahl.currency: Der dreistellige ISO-Währungscode (z. B. 'USD', 'EUR'). Dies ist erforderlich, wennstyle: 'currency'verwendet wird.
3. Komponente auf einer Seite verwenden
Sie können diese Komponente jetzt in Ihren Server- oder Client-Komponenten verwenden, um Preise anzuzeigen.
// app/[lang]/page.tsx
import ProductPrice from '@/app/components/ProductPrice';
export default function Home() {
const product = {
price: 1299.99,
currency: 'USD',
};
const productInEuros = {
price: 1199.5,
currency: 'EUR',
};
return (
<div>
<h1>Product</h1>
<p>
Price (USD): <ProductPrice price={product.price} currencyCode={product.currency} />
</p>
<p>
Price (EUR): <ProductPrice price={productInEuros.price} currencyCode={productInEuros.currency} />
</p>
</div>
);
}
Ein Benutzer, der /en besucht, sieht „Price (USD): 1.299,99 $" und „Price (EUR): 1.199,50 €". Ein Benutzer, der /es besucht, sieht „Price (USD): 1.299,99 $" und „Price (EUR): 1.199,50 €".