Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как отформатировать цену

Короткий ответ

Intl.NumberFormat со style: 'currency' добавляет знак валюты, разделители и два знака после запятой:

const price = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
 
console.log(price.format(1234.5));

Результат:

$1,234.50

Другие страны

Язык определяет, где стоит знак и какие используются разделители:

console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(1234.5));
console.log(new Intl.NumberFormat('en-GB', { style: 'currency', currency: 'EUR' }).format(1234.5));

Результат:

1.234,50 €
€1,234.50

Без центов

Для целых сумм задайте ноль знаков после запятой:

const price = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 });
 
console.log(price.format(1999));

Результат:

$1,999

Хранение в центах

Чтобы избежать ошибок округления, магазины часто хранят цены в центах целыми числами и делят на 100 только при выводе:

const cents = 1999 + 2999;
const price = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
 
console.log(price.format(cents / 100));

Результат:

$49.98

Частая ошибка

toFixed(2) только округляет: ни валюты, ни разделителей тысяч он не добавляет:

console.log('$' + (1234.5).toFixed(2));

Результат:

$1234.50

Функции из этого ответа

  • Intl.NumberFormat — Форматирует числа, валюты, проценты и единицы измерения по правилам языка.
  • Number.prototype.toLocaleString — Форматирует число по правилам языка: разделители разрядов, валюта, проценты.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.