Форматирование чисел
Работа с десятичными и разделителями групп разрядов
Проблема
Большое число, например 10000.5, записывается как 10.000,5 в Германии и как 10,000.5 в США. Если показывать число по правилам одной страны, пользователи из других стран могут неправильно его понять из-за отличий в десятичных и разделителях групп разрядов.
Решение
Используйте специальный компонент форматирования из react-intl, например FormattedNumber. Этот компонент автоматически определяет текущий язык из провайдера и форматирует примитив number в строку с правильными, локализованными десятичными и разделителями групп разрядов.
Шаги
1. Создайте клиентский компонент для чисел
Как и другие компоненты из react-intl, FormattedNumber должен использоваться внутри клиентского компонента.
Создайте новый компонент app/components/ProductInfo.tsx, который будет отображать отформатированное число.
// 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. Передайте параметры форматирования
Компонент FormattedNumber принимает параметры для управления выводом:
value— этоnumber, который нужно отформатировать.minimumFractionDigitsиmaximumFractionDigitsиспользуются здесь, чтобы явно показать одну десятичную (например, 4.0).
3. Используйте компонент на странице
Теперь вы можете использовать этот компонент на любой странице с информацией о продукте.
// 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>
);
}
Пользователь, который заходит на /en, увидит «Всего отзывов: 1,234,567» и «Средняя оценка: 4.0». А пользователь на /es увидит «Всего отзывов: 1.234.567» и «Средняя оценка: 4,0».