25

Как форматировать числа в виде строк валюты

16

Я хочу отформатировать цену в JavaScript. Мне нужна функция, которая принимает аргумент типа float и возвращает строку, отформатированную следующим образом:

"$ 2,500.00"

Как я могу это сделать?

5 ответ(ов)

0

Вот еще одна попытка, чисто для развлечения:

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, которая принимает число и форматирует его в строку, представляющую собой долларовую сумму. Она добавляет запятые для разделения тысяч и всегда показывает две десятичные цифры. Тесты в примере демонстрируют различные входные значения и их правильное отображение.

0

Вы, вероятно, хотите использовать следующий код:

f.nettotal.value = "$" + showValue.toFixed(2);

Этот код устанавливает значение свойства value элемента формы nettoval, добавляя символ доллара перед числом, отформатированным с двумя знаками после запятой.

0

Ваш код содержит две версии функции форматирования валюты. Первая версия проста и понятна, в то время как вторая, более сложная, позволяет лучше настраивать форматирование.

Вот первая версия функции 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

Эти функции полезны для форматирования чисел в виде валюты, и с помощью настроек вы можете легко адаптировать код под разные валютные форматы.

0

Ваша функция 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, и вы можете заменить запятую на любой другой символ по вашему выбору.

0

Основная задача заключается в добавлении разделителей тысяч, и это можно сделать следующим образом:

<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, которая форматирует число до двух десятичных знаков.

  1. Функция ins1000Sep разбивает число на целую и дробную части, затем реверсирует целую часть, добавляет нужные запятые (разделители тысяч), и в итоге реверсирует целую часть снова, чтобы вернуть её в исходный порядок.

  2. Функция rem1000Sep просто удаляет запятые из строки.

  3. Функция formatNum округляет число до двух десятичных знаков и добавляет соответствующие нули в конце, если это необходимо.

В примере кода, нажатие кнопки вызывает всплывающее окно с отформатированным числом, которое имеет разделители тысяч.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь