Фреймворк Fresh предоставляет мощные возможности для работы с данными
на стороне сервера и клиента, что делает его удобным инструментом для
динамического отображения чисел, включая валюту. В основе форматирования
валют лежит объект Intl.NumberFormat, который является
частью стандартного JavaScript и позволяет корректно отображать суммы в
зависимости от локали и типа валюты.
Intl.NumberFormatДля форматирования валюты создаётся экземпляр
Intl.NumberFormat, которому передаются два параметра:
локаль и объект с настройками.
const formatter = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB',
minimumFractionDigits: 2,
maximumFractionDigits: 2
});
console.log(formatter.format(123456.789)); // 123 456,79 ₽
'currency'.Fresh позволяет динамически определять локаль в зависимости от данных пользователя или настроек приложения. Локаль влияет на разделители тысяч, десятичный знак и позицию символа валюты.
const usdFormatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
});
console.log(usdFormatter.format(123456.789)); // $123,456.79
Использование разных локалей позволяет строить международные приложения с корректным отображением цен для каждого региона.
В Fresh компоненты могут быть как серверными, так и клиентскими. Серверные компоненты идеально подходят для предварительного форматирования валюты перед рендерингом HTML. Пример:
export default function Product({ price }) {
const formattedPrice = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB'
}).format(price);
return (
<div>
<h2>Цена товара:</h2>
<p>{formattedPrice}</p>
</div>
);
}
Клиентские компоненты также могут использовать
Intl.NumberFormat, особенно если цена обновляется
динамически после загрузки страницы, например, при выборе количества
товара или валюты.
Для приложений с поддержкой нескольких валют важна возможность менять формат в зависимости от выбранной пользователем валюты. Это можно реализовать через пропсы компонента:
export default function Price({ amount, currency, locale }) {
const formattedPrice = new Intl.NumberFormat(locale, {
style: 'currency',
currency
}).format(amount);
return <span>{formattedPrice}</span>;
}
// Пример использования:
<Price amount={1000} currency="EUR" locale="de-DE" />
// 1.000,00 €
Такой подход позволяет создавать универсальные компоненты, не зависящие от конкретной валюты или локали.
Если приложение обрабатывает массивы цен, можно применить форматирование в цикле или через методы массивов:
const prices = [100, 2500.5, 98765.43];
const formatter = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB'
});
const formattedPrices = prices.map(price => formatter.format(price));
// ["100,00 ₽", "2 500,50 ₽", "98 765,43 ₽"]
Этот подход позволяет одновременно выводить таблицы или списки с корректным отображением валюты.
С помощью опций currencyDisplay можно управлять форматом
символа валюты:
'symbol' — отображает символ (₽, $, €).'code' — выводит код валюты (RUB, USD, EUR).'name' — отображает полное название валюты (рубль,
доллар, евро).const formatter = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'USD',
currencyDisplay: 'name'
});
console.log(formatter.format(123)); // 123,00 доллара США
Опции minimumFractionDigits и
maximumFractionDigits позволяют контролировать округление
чисел, что важно для корректного отображения цен:
const formatter = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB',
minimumFractionDigits: 0,
maximumFractionDigits: 0
});
console.log(formatter.format(12345.67)); // 12 346 ₽
Таким образом, можно избавиться от дробной части там, где это не требуется, например, для крупных сумм.
Подобная организация кода обеспечивает единообразное форматирование и упрощает поддержку большого проекта с международными ценами.