Как форматировать числа в виде строк валюты
Я хочу отформатировать цену в JavaScript. Мне нужна функция, которая принимает аргумент типа float
и возвращает строку, отформатированную следующим образом:
"$ 2,500.00"
Как я могу это сделать?
5 ответ(ов)
Вот еще одна попытка, чисто для развлечения:
function formatDollar(num) {
var p = num.toFixed(2).split(".");
return "$" + p[0].split("").reverse().reduce(function(acc, num, i, orig) {
return num + (num != "-" && i && !(i % 3) ? "," : "") + acc;
}, "") + "." + p[1];
}
Вот несколько тестов:
formatDollar(45664544.23423) // "$45,664,544.23"
formatDollar(45) // "$45.00"
formatDollar(123) // "$123.00"
formatDollar(7824) // "$7,824.00"
formatDollar(1) // "$1.00"
formatDollar(-1345) // "$-1,345.00"
formatDollar(-3) // "$-3.00"
Этот код определяет функцию formatDollar
, которая принимает число и форматирует его в строку, представляющую собой долларовую сумму. Она добавляет запятые для разделения тысяч и всегда показывает две десятичные цифры. Тесты в примере демонстрируют различные входные значения и их правильное отображение.
Вы, вероятно, хотите использовать следующий код:
f.nettotal.value = "$" + showValue.toFixed(2);
Этот код устанавливает значение свойства value
элемента формы nettoval
, добавляя символ доллара перед числом, отформатированным с двумя знаками после запятой.
Ваш код содержит две версии функции форматирования валюты. Первая версия проста и понятна, в то время как вторая, более сложная, позволяет лучше настраивать форматирование.
Вот первая версия функции moneyFormat
, которая принимает два аргумента: price
(значение цены) и необязательный sign
(символ валюты, по умолчанию '$'). Она форматирует число, добавляя запятые и два знака после запятой:
function moneyFormat(price, sign = '$') {
const pieces = parseFloat(price).toFixed(2).split('')
let ii = pieces.length - 3
while ((ii-=3) > 0) {
pieces.splice(ii, 0, ',')
}
return sign + pieces.join('')
}
console.log(
moneyFormat(100),
moneyFormat(1000),
moneyFormat(10000.00),
moneyFormat(1000000000000000000)
)
Вывод будет таким:
$100.00 $1,000.00 $10,000.00 $1,000,000,000,000,000,000.00
Вторая версия представляет собой более универсальную функцию makeMoneyFormatter
, которая позволяет задавать дополнительные параметры форматирования, например, символ валюты, разделитель, десятичный разделитель и другие опции:
const makeMoneyFormatter = ({
sign = '$',
delimiter = ',',
decimal = '.',
append = false,
precision = 2,
round = true,
custom
} = {}) => value => {
const e = [1, 10, 100, 1000, 10000, 100000, 1000000, 10000000]
// Округление или парсинг числа
value = round
? (Math.round(value * e[precision]) / e[precision])
: parseFloat(value)
const pieces = value
.toFixed(precision)
.replace('.', decimal)
.split('')
let ii = pieces.length - (precision ? precision + 1 : 0)
while ((ii-=3) > 0) {
pieces.splice(ii, 0, delimiter)
}
if (typeof custom === 'function') {
return custom({
sign,
float: value,
value: pieces.join('')
})
}
return append
? pieces.join('') + sign
: sign + pieces.join('')
}
// Создание форматтеров валюты с правильными настройками
const formatDollar = makeMoneyFormatter()
const formatPound = makeMoneyFormatter({
sign: '£',
precision: 0
})
const formatEuro = makeMoneyFormatter({
sign: '€',
delimiter: '.',
decimal: ',',
append: true
})
const customFormat = makeMoneyFormatter({
round: false,
custom: ({ value, float, sign }) => `SALE:$${value}USD`
})
console.log(
formatPound(1000),
formatDollar(10000.0066),
formatEuro(100000.001),
customFormat(999999.555)
)
Вывод будет следующим:
£1,000 €100.000,00 $10,000.01 SALE:$999999.555USD
Эти функции полезны для форматирования чисел в виде валюты, и с помощью настроек вы можете легко адаптировать код под разные валютные форматы.
Ваша функция toCurrencyString
делает преобразование числа в формат с разделением на группы по три цифры, но вместо пробела вы хотите использовать запятую или точку. Можно сделать это с помощью регулярного выражения.
Вот более короткий способ добавить пробел, запятую или точку в нужные места:
Number.prototype.toCurrencyString = function(separator = ' '){
return this.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + separator);
};
let n = 12345678.9;
alert(n.toCurrencyString(',')); // Используем запятую в качестве разделителя
Здесь функция toCurrencyString
принимает параметр separator
, который позволяет вам указывать, какой символ использовать для разделения групп цифр. Это дает вам гибкость в выборе разделителя, а также делает ваш код более кратким и удобным.
Вывод для n.toCurrencyString(',')
будет 12,345,678.90
, и вы можете заменить запятую на любой другой символ по вашему выбору.
Основная задача заключается в добавлении разделителей тысяч, и это можно сделать следующим образом:
<script type="text/javascript">
function ins1000Sep(val) {
val = val.split(".");
val[0] = val[0].split("").reverse().join("");
val[0] = val[0].replace(/(\d{3})/g, "$1,");
val[0] = val[0].split("").reverse().join("");
val[0] = val[0].indexOf(",") == 0 ? val[0].substring(1) : val[0];
return val.join(".");
}
function rem1000Sep(val) {
return val.replace(/,/g, "");
}
function formatNum(val) {
val = Math.round(val*100)/100;
val = ("" + val).indexOf(".") > -1 ? val + "00" : val + ".00";
var dec = val.indexOf(".");
return dec == val.length-3 || dec == 0 ? val : val.substring(0, dec+3);
}
</script>
<button onclick="alert(ins1000Sep(formatNum(12313231)));">
Здесь мы создаем три функции: ins1000Sep
, которая добавляет разделители тысяч, rem1000Sep
, которая убирает их, и formatNum
, которая форматирует число до двух десятичных знаков.
Функция
ins1000Sep
разбивает число на целую и дробную части, затем реверсирует целую часть, добавляет нужные запятые (разделители тысяч), и в итоге реверсирует целую часть снова, чтобы вернуть её в исходный порядок.Функция
rem1000Sep
просто удаляет запятые из строки.Функция
formatNum
округляет число до двух десятичных знаков и добавляет соответствующие нули в конце, если это необходимо.
В примере кода, нажатие кнопки вызывает всплывающее окно с отформатированным числом, которое имеет разделители тысяч.
Как форматировать число с запятыми в качестве разделителей тысяч?
Форматирование даты в JavaScript в виде yyyy-mm-dd
В чем разница между String.slice и String.substring?
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"