Я хотел бы отформатировать цену в JavaScript. Я хотел бы функцию, которая принимает float
в качестве аргумента и возвращает такой string
формат:
"$ 2,500.00"
Какой лучший способ сделать это?
javascript
formatting
currency
Daniel Magliola
источник
источник
formatNumber
javascript нет встроенной функцииОтветы:
Number.prototype.toFixed
Это решение совместимо с каждым основным браузером:
Все, что вам нужно, это добавить символ валюты (например
"$" + profits.toFixed(2)
), и вы получите свою сумму в долларах.Пользовательская функция
Если вам требуется использовать
,
между каждой цифрой, вы можете использовать эту функцию:Используйте это так:
Если вы всегда собираетесь использовать «.» и ',', вы можете оставить их вне вашего вызова метода, и метод по умолчанию выберет их для вас.
Если в вашей культуре два символа перевернуты (т. Е. Европейцы), и вы хотите использовать значения по умолчанию, просто вставьте следующие две строки в
formatMoney
метод:Пользовательская функция (ES6)
Если вы можете использовать современный синтаксис ECMAScript (например, через Babel), вы можете использовать эту более простую функцию:
источник
d
иt
быть.
и,
соответственно, чтобы вам не приходилось указывать их каждый раз. Кроме того, я рекомендую изменить началоreturn
оператора следующим образом:return s + '$' + [rest]
иначе вы не получите знак доллара.Intl.numberformat
Javascript имеет средство форматирования чисел (часть Интернационализации API).
JS скрипка
Использовать
undefined
вместо первого аргумента ('en-US'
в примере), чтобы использовать системный языковой стандарт (пользовательский языковой стандарт, если код выполняется в браузере). Дальнейшее объяснение кода локали .Вот список кодов валют .
Intl.NumberFormat vs Number.prototype.toLocaleString
Последнее замечание, сравнивающее это со старшим.
toLocaleString
, Они оба предлагают по существу одинаковую функциональность. Однако toLocaleString в его более старых версиях (pre-Intl) фактически не поддерживает локали : он использует системную локаль. Поэтому убедитесь, что вы используете правильную версию ( MDN предлагает проверить наличиеIntl
). Кроме того, производительность обоих одинакова для одного элемента, но если у вас много чисел для форматирования, использованиеIntl.NumberFormat
происходит в ~ 70 раз быстрее. Вот как использоватьtoLocaleString
:Некоторые замечания по поддержке браузера
источник
Краткое и быстрое решение (работает везде!)
Идея этого решения заменить совпавшие секции с первым матчем и запятой, то есть
'$&,'
. Сопоставление выполняется с использованием подхода «упреждения» . Вы можете прочитать выражение как «соответствовать номеру, если за ним следует последовательность из трех наборов чисел (один или несколько) и точка» .ИСПЫТАНИЯ:
ДЕМО: http://jsfiddle.net/hAfMM/9571/
Расширенное короткое решение
Вы также можете расширить прототип
Number
объекта, чтобы добавить дополнительную поддержку любого количества десятичных знаков[0 .. n]
и размера групп чисел[0 .. x]
:ДЕМО / ИСПЫТАНИЯ: http://jsfiddle.net/hAfMM/435/
Супер расширенное короткое решение
В этой расширенной версии вы можете установить различные типы разделителей:
ДЕМО / ИСПЫТАНИЯ: http://jsfiddle.net/hAfMM/612/
источник
.replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")
.Number.prototype.toMoney = (decimal=2) -> @toFixed(decimal).replace /(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,"
\.
с$
(конец строки), то естьthis.toFixed(0).replace(/(\d)(?=(\d{3})+$)/g, "$1,")
.$1,
. Сопоставление выполняется с использованием подхода «упреждения» . Вы можете прочитать выражение как «соответствовать номеру, если за ним следует последовательность из трех наборов чисел (один или несколько) и точка» .Посмотрите на объект JavaScript Number и посмотрите, может ли он вам помочь.
toLocaleString()
отформатирует число с использованием разделителя тысяч, определяемого местоположением.toFixed()
округляет число до определенного количества десятичных знаков.Чтобы использовать их одновременно, значение должно изменить свой тип на число, потому что они оба выводят строку.
Пример:
источник
toLocaleString
которой используется языковой стандарт системы, и новая (несовместимая), которая поступает из ECMAScript Intl API. Объяснил здесь . Этот ответ, похоже, предназначен для старой версии.Ниже приведен код Patrick Desjardins (псевдоним Daok) с небольшим количеством добавленных комментариев и некоторыми незначительными изменениями:
и вот несколько тестов:
Незначительные изменения:
немного сдвинулся,
Math.abs(decimals)
чтобы быть сделано только тогда, когда нетNaN
.decimal_sep
больше не может быть пустой строкой (НЕОБХОДИМО какой-то десятичный разделитель)мы используем
typeof thousands_sep === 'undefined'
как предложено в разделе Как лучше определить, не передан ли аргумент в функцию JavaScript(+n || 0)
не нужно, потому чтоthis
этоNumber
объектJS Fiddle
источник
parseInt
Называют по абсолютной величине целой части числа. Партия INTEGER не может начинаться с нуля, если только это не ноль! ИparseInt(0) === 0
восьмеричное, или десятичное.0
, считается восьмеричнымparseInt
. Но в этом коде это НЕВОЗМОЖНО дляparseInt
получения в016
качестве входных данных (или любого другого восьмеричного отформатированного значения), поскольку передаваемый аргументparseInt
1-й обрабатываетсяMath.abs
функцией. Таким образом, нет способаparseInt
получить число, начинающееся с нуля, если только это не ноль или0.nn
(гдеnn
десятичные дроби). Но оба0
и0.nn
строки будут преобразованыparseInt
в простой ноль, как предполагается.Если сумма это число, скажем
-123
, тогдабудет производить строку
"-$123.00"
.Вот полный рабочий пример .
источник
minimumFractionDigits: 0
accounting.js - это крошечная библиотека JavaScript для форматирования чисел, денег и валюты.
источник
Вот лучший форматер js money, который я видел:
Это было переформатировано и заимствовано отсюда: https://stackoverflow.com/a/149099/751484
Вам нужно будет указать свой собственный обозначение валюты (вы использовали $ выше).
Назовите это так (хотя обратите внимание, что для аргументов по умолчанию задано значение 2, запятая и точка, поэтому вам не нужно указывать аргументы, если вы предпочитаете):
источник
var
заявлении.Здесь уже есть несколько отличных ответов. Вот еще одна попытка, просто для удовольствия:
И некоторые тесты:
Отредактировано: теперь оно будет обрабатывать и отрицательные числа
источник
i = orig.length - i - 1
обратного вызова. Тем не менее, еще один обход массива.reduce
метод был представлен в Ecmascript 1.8 и не поддерживается в Internet Explorer 8 и ниже.Работает для всех текущих браузеров
Используется
toLocaleString
для форматирования валюты в ее чувствительном к языку представлении (с использованием кодов валют ISO 4217 ).Пример фрагментов кода южноафриканского рэнда для @avenmore
источник
Я думаю, что вы хотите
f.nettotal.value = "$" + showValue.toFixed(2);
источник
Numeral.js - библиотека js для простого форматирования чисел @adamwdraper
источник
Хорошо, основываясь на том, что вы сказали, я использую это:
Я открыт для предложений по улучшению (я бы предпочел не включать YUI только для этого :-)) Я уже знаю, что должен обнаруживать "." вместо того, чтобы просто использовать его в качестве десятичного разделителя ...
источник
Я использую библиотеку Globalize (от Microsoft):
Это отличный проект для локализации чисел, валют и дат и их автоматического форматирования в соответствии с языком пользователя! ... и, несмотря на то, что это должно быть расширение jQuery, в настоящее время это 100% независимая библиотека. Я предлагаю всем вам попробовать! :)
источник
javascript-number-formatter (ранее в Google Code )
Всего 75 строк, включая информацию о лицензии MIT, пустые строки и комментарии.#,##0.00
или с отрицанием-000.####
.# ##0,00
,#,###.##
,#'###.##
или любой тип символа , не нумерации.#,##,#0.000
или#,###0.##
все действительны.##,###,##.#
или0#,#00#.###0#
все в порядке.format( "0.0000", 3.141592)
.(отрывок из его README)
источник
+1 Джонатану М за предоставление оригинального метода. Поскольку это явно средство форматирования валюты, я пошел дальше и добавил символ валюты (по умолчанию «$») к выводу и добавил запятую по умолчанию в качестве разделителя тысяч. Если вы на самом деле не хотите использовать символ валюты (или разделитель тысяч), просто используйте «» (пустую строку) в качестве аргумента для него.
источник
+n || 0
единственное, что кажется немного странным (для меня в любом случае).this
это совершенно полезное имя переменной. Преобразование вn
так, чтобы вы могли сохранить 3 символа в определенное время, возможно, было необходимо в эпоху, когда ОЗУ и пропускная способность были подсчитаны в КБ, но это просто запутывает в эпоху, когда минимизатор позаботится обо всем этом, прежде чем он когда-либо попадет в производство. Другие умные микрооптимизации по крайней мере спорны.Существует порт JavaScript функции PHP "number_format".
Я считаю его очень полезным, так как он прост в использовании и узнаваем для разработчиков PHP.
(Блок комментариев от оригинала , включенный ниже для примеров и кредитов, где это необходимо)
источник
Более короткий метод (для вставки пробела, запятой или точки) с регулярным выражением?
источник
Ничего подобного не видел. Это довольно кратко и легко понять.
Вот версия с большим количеством опций в конечном выводе, позволяющая форматировать разные валюты в разных форматах местности.
источник
Ответ Патрика Дежарденса выглядит неплохо, но я предпочитаю свой простой javascript. Вот функция, которую я только что написал, чтобы взять число и вернуть его в формате валюты (без знака доллара)
источник
Основная часть вставляет разделители тысяч, что можно сделать так:
источник
Есть встроенный
function
toFixed вjavascript
источник
toFixed()
toFixed()
является функциейNumber
объекта и не будет работать,var num
если бы он былString
, поэтому мне помог дополнительный контекст.От WillMaster .
источник
Я предлагаю класс NumberFormat из API визуализации Google .
Вы можете сделать что-то вроде этого:
Я надеюсь, что это помогает.
источник
Это может быть немного поздно, но вот метод, который я только что разработал для коллеги, чтобы добавить функцию с поддержкой локали
.toCurrencyString()
ко всем числам. Интернализация предназначена только для группировки чисел, а НЕ для знака валюты - если вы выводите доллары, используйте их в том"$"
виде, в каком они есть, потому что$123 4567
в Японии или Китае такое же количество долларов США, как$1,234,567
и в США. Если вы выводите евро / и т. Д., Измените знак валюты с"$"
.Объявите об этом где-нибудь в вашем HEAD или там, где это необходимо, непосредственно перед тем, как вам нужно его использовать:
Тогда все готово! Используйте
(number).toCurrencyString()
везде, где вам нужно вывести число в качестве валюты.источник
Как обычно, есть несколько способов сделать одно и то же, но я бы не стал использовать их,
Number.prototype.toLocaleString
поскольку они могут возвращать разные значения в зависимости от пользовательских настроек.Я также не рекомендую расширять
Number.prototype
прототипы нативных объектов - это плохая практика, так как это может вызвать конфликты с чужим кодом (например, библиотеками / фреймворками / плагинами) и может быть несовместимо с будущими реализациями / версиями JavaScript.Я считаю, что Регулярные выражения - лучший подход к проблеме, вот моя реализация:
отредактировано 2010/08/30: добавлена опция для установки количества десятичных цифр. отредактировано 2011/08/23: добавлена опция для установки числа десятичных цифр на ноль.
источник
Вот некоторые решения, все из которых проходят тестовый набор, тестовый набор и тест включены, если вы хотите скопировать и вставить для тестирования, попробуйте This Gist .
Метод 0 (RegExp)
Основываясь на https://stackoverflow.com/a/14428340/1877620 , но исправьте, если нет десятичной точки.
Способ 1
Метод 2 (разделить на массив)
Метод 3 (цикл)
Пример использования
Разделитель
Если нам нужен пользовательский разделитель тысяч или десятичный разделитель, используйте
replace()
:Тестирование
эталонный тест
источник
источник
Простая опция для правильного размещения запятой путем обращения строки вначале и базового регулярного выражения.
источник
Я нашел это из: accounting.js . Это очень легко и идеально подходит для моих нужд.
источник
$('#price').val( accounting.formatMoney(OOA, { symbol: "€", precision: 2,thousand: ".", decimal :",",format: "%v%s" } ) );
- показать 1.000,00 E