Zahlen formatieren
Umgang mit Dezimal- und Gruppierungstrennzeichen
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 nach der Konvention einer Region führt zu Verwirrung bei Benutzern in anderen Regionen, die den Wert aufgrund falscher Dezimal- und Gruppierungstrennzeichen falsch interpretieren könnten.
Lösung
Verwenden Sie eine spezielle Formatierungskomponente aus 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, regionsspezifischen Dezimal- und Gruppierungstrennzeichen verwendet.
Schritte
1. Erstellen einer 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 anzeigen wird.
// 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. Übergeben von Formatierungsoptionen
Die FormattedNumber-Komponente akzeptiert Optionen zur Steuerung der Ausgabe:
valueist die zu formatierendenumber.minimumFractionDigitsundmaximumFractionDigitswerden hier verwendet, um die Anzeige einer Dezimalstelle zu erzwingen (z.B. 4,0).
3. Verwendung der 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 Benutzer, der /en besucht, sieht "Total reviews: 1,234,567" und "Average rating: 4.0". Ein Benutzer, der /es besucht, sieht "Total reviews: 1.234.567" und "Average rating: 4,0".