Zahlen formatieren
Umgang mit Dezimal- und Tausendertrennzeichen
Problem
Eine große Zahl wie 10000.5 wird in Deutschland als 10.000,5 und in den USA als 10,000.5 geschrieben. Die Anzeige der Zahl unter Verwendung der Konvention einer Region führt zu Verwirrung bei Nutzern in anderen Regionen, die den Wert aufgrund falscher Dezimal- und Tausendertrennzeichen möglicherweise falsch interpretieren.
Lösung
Verwenden Sie eine dedizierte Formatierungskomponente von react-intl, wie z. B. FormattedNumber. Diese Komponente liest automatisch die aktuelle Sprache aus ihrem Provider und formatiert einen number-Primitiv in einen String, der die korrekten, gebietsschemaspezifischen Dezimal- und Tausendertrennzeichen verwendet.
Schritte
1. Erstellen Sie eine Client-Komponente für Zahlen
Wie andere react-intl-Komponenten muss FormattedNumber innerhalb einer Client-Komponente verwendet werden.
Erstellen Sie eine neue Komponente, app/components/ProductInfo.tsx, die eine formatierte Zahl anzeigt.
// app/components/ProductInfo.tsx
'use client';
import { FormattedNumber } of 'react-intl';
type Props = {
reviewCount: number;
averageRating: number;
};
export default function ProductInfo({ reviewCount, averageRating }: Props) {
return (
<div>
<h3>Product details</h3>
<p>
Total reviews:
{/* Basic number formatting */}
<FormattedNumber value={reviewCount} />
</p>
<p>
Average rating:
{/* Formatting with options */}
<FormattedNumber
value={averageRating}
minimumFractionDigits={1}
maximumFractionDigits={1}
/>
</p>
</div>
);
}
2. Formatierungsoptionen übergeben
Die FormattedNumber-Komponente akzeptiert Optionen zur Steuerung der Ausgabe:
valueist der zu formatierendenumber.minimumFractionDigitsundmaximumFractionDigitswerden hier verwendet, um die Anzeige einer Dezimalstelle zu erzwingen (z. B. 4,0).
3. Verwenden Sie die Komponente auf einer Seite
Jetzt können Sie diese Komponente auf jeder Seite verwenden, die Produktinformationen anzeigt.
// app/[lang]/page.tsx
import ProductInfo from '@/app/components/ProductInfo';
export default function Home() {
const product = {
reviews: 1234567,
rating: 4.0,
};
return (
<div>
<h1>Welcome</h1>
<ProductInfo
reviewCount={product.reviews}
averageRating={product.rating}
/>
</div>
);
}
Ein Nutzer, der /en besucht, sieht „Total reviews: 1,234,567" und „Average rating: 4.0". Ein Nutzer, der /es besucht, sieht „Total reviews: 1.234.567" und „Average rating: 4,0".