Я пытаюсь напечатать целое число в JavaScript с запятыми в качестве разделителей тысяч. Например, я хочу показать число 1234567 как «1,234,567». Как бы я поступил так?
Вот как я это делаю:
function numberWithCommas(x) {
x = x.toString();
var pattern = /(-?\d+)(\d{3})/;
while (pattern.test(x))
x = x.replace(pattern, "$1,$2");
return x;
}
Есть ли более простой или более элегантный способ сделать это? Было бы хорошо, если бы он работал и с поплавками, но это не обязательно. Он не должен зависеть от локали, чтобы выбирать между точками и запятыми.
javascript
formatting
numbers
Элиас Замария
источник
источник
Number.prototype.toLocaleString
до сих пор не работает Safari, в 2016 году . Вместо фактического форматирования числа, оно просто возвращает его, без ошибок. Получив сегодня самый большой лицевойОтветы:
Я использовал идею из ответа Керри, но упростил ее, так как я просто искал что-то простое для моей конкретной цели. Вот что я сделал:
Показать фрагмент кода
Регулярное выражение использует 2 утверждения предпросмотра:
Например, если вы передадите его
123456789.01
, положительное утверждение будет соответствовать каждому пятну слева от 7 (так789
как кратно 3 цифрам,678
кратно 3 цифрам567
и т. Д.). Отрицательное утверждение проверяет, что кратное 3 цифрам не имеет никаких цифр после него.789
после него стоит точка, поэтому она точно кратна 3 цифрам, поэтому запятая идет туда.678
является кратным 3 цифрам, но после него есть9
после него, поэтому эти 3 цифры являются частью группы из 4, и запятая здесь не идет. Аналогично для567
.456789
6 цифр, что кратно 3, поэтому перед этим стоит запятая.345678
кратен 3, но имеет9
после него, поэтому запятая не идет. И так далее.\B
не позволяет регулярному выражению ставить запятую в начале строки.@ neu-rah упомянул, что эта функция добавляет запятые в нежелательные места, если после десятичной точки больше 3 цифр. Если это проблема, вы можете использовать эту функцию:
Показать фрагмент кода
@ tjcrowder отметил, что теперь, когда JavaScript имеет lookbehind ( информация о поддержке ), его можно решить в самом регулярном выражении:
Показать фрагмент кода
(?<!\.\d*)
является отрицательным взглядом, который говорит, что совпадению не может предшествовать.
ноль или более цифр. Отрицательная быстрее просмотра назад , чемsplit
иjoin
решения ( сравнение ), по крайней мере , в V8.источник
Я удивлен, что никто не упомянул Number.prototype.toLocaleString . Он реализован в JavaScript 1.5 (который был представлен в 1999 году), поэтому он в основном поддерживается во всех основных браузерах.
Это также работает в Node.js с v0.12 через включение Intl
Просто обратите внимание, что эта функция возвращает строку, а не число.
Если вы хотите что-то другое, Numeral.js может быть интересным.
источник
var number = 123456.000; number.toLocaleString('en-US', {minimumFractionDigits: 2}); "123,456.00"
эти опции не работают в FF или Safari.X XXX XXX,YYY
).toLocaleString
работает в Node.js с v0.12 через включение Intl .parseInt("1234567", 10).toLocaleString('en-US', {minimumFractionDigits: 2})
илиnew Number("1234567").toLocaleString('en-US', {minimumFractionDigits: 2})
вместо этого. Это не работает, потому что вы используете его в строке, а не в числе.⚠ Имейте в виду, что максимальное целочисленное значение javascript составляет 9007199254740991.
toLocaleString :
NumberFormat ( Safari не поддерживается):
Из того, что я проверял (по крайней мере, Firefox), они более или менее одинаковы в отношении производительности.
источник
toLocaleString
работы по сафари, варианты неtoLocaleString
решение , вероятно , следует также включать в требуемом языке, таким образомtoLocaleString("en")
, потому что английский шаблон использует запятые. Тем не менее, еслиtoLocaleString()
во Франции не используется индикатор локали, он будет давать точки вместо запятых, потому что это то, что используется для локального разделения тысяч.Я предлагаю использовать phpjs.org's number_format ()
ОБНОВЛЕНИЕ 13/13/14
Люди сообщают, что это работает не так, как ожидалось, поэтому я сделал JS Fiddle, который включает в себя автоматические тесты.
Обновление 26/11/2017
Вот эта скрипка в виде фрагмента стека с немного измененным выводом:
источник
Это вариант ответа @ mikez302, но он изменен для поддержки чисел с десятичными числами (согласно отзыву @ neu-rah о числеWithCommas (12345.6789) -> «12 345,6 789» вместо «12 345,6789»
источник
источник
Использование регулярного выражения
Использование toLocaleString ()
ref MDN: Number.prototype.toLocaleString ()
Использование Intl.NumberFormat ()
ref Intl.NumberFormat
ДЕМО НА ЗДЕСЬ
Представление
http://jsben.ch/sifRd
источник
Intl.NumberFormat
Родная функция JS. Поддерживаются IE11, Edge, последние версии Safari, Chrome, Firefox, Opera, Safari для iOS и Chrome для Android.
источник
Спасибо всем за их ответы. Я построил некоторые ответы, чтобы создать более универсальное решение.
Первый фрагмент кода добавляет функцию , которая имитирует PHP «S
number_format()
на номер прототипа. Если я форматирую число, я обычно хочу использовать десятичные разряды, чтобы функция принимала количество отображаемых десятичных разрядов. Некоторые страны используют запятые в качестве десятичного разделителя и десятичного разделителя в качестве разделителя тысяч, поэтому функция позволяет устанавливать эти разделители.Вы бы использовали это следующим образом:
Я обнаружил, что мне часто нужно возвращать число для математических операций, но parseFloat преобразует 5000 в 5, просто принимая первую последовательность целочисленных значений. Поэтому я создал свою собственную функцию преобразования с плавающей точкой и добавил ее в прототип String.
Теперь вы можете использовать обе функции следующим образом:
источник
var parts = this.toFixed(decimals).toString().split('.');
var dec_point
. Спасибо что подметил это.Я впечатлен количеством ответов на этот вопрос. Мне нравится ответ от uKolka :
Но, к сожалению, в некоторых регионах, таких как испанский, он не работает (IMHO), как ожидается, для чисел ниже 10000:
Дает
1000
и нет1.000
.Посмотрите, чтобы toLocaleString не работал на числах меньше 10000 во всех браузерах, чтобы знать почему.
Поэтому мне пришлось воспользоваться ответом Элиаса Замарии, выбрав правильный символ разделения тысяч:
Этот работает хорошо как одна строка для обоих языков, которые используют
,
или.
как разделитель тысяч и начинает работать с 1000 во всех случаях.Дает
1.000
с контекстом испанской локали.Если вы хотите иметь абсолютный контроль над форматированием числа, вы также можете попробовать следующее:
Дает
1,234.57
.Этот не нуждается в регулярном выражении. Он работает,
toFixed
сначала подгоняя число к желаемому количеству десятичных знаков , а затем разделяя его на десятичную точку,.
если она есть. Затем левая сторона превращается в массив цифр, который переворачивается. Затем разделитель тысяч добавляется каждые три цифры от начала, и результат снова меняется на противоположный. Конечный результат - объединение двух частей. Знак входного номераMath.abs
сначала удаляется, а затем при необходимости возвращается.Это не однострочник, но не намного дольше и легко превращается в функцию. Переменные были добавлены для ясности, но они могут быть заменены их желаемыми значениями, если они известны заранее. Вы можете использовать выражения, которые используются
toLocaleString
для определения правильных символов для десятичной точки и разделителя тысяч для текущей локали (имейте в виду, что для них требуется более современный Javascript.)источник
Я думаю, что это самое короткое регулярное выражение, которое делает это:
Я проверил это на нескольких числах, и это сработало.
источник
Number.prototype.toLocaleString()
было бы здорово, если бы он был предоставлен всеми браузерами (Safari) .Я проверил все остальные ответы, но никто, казалось, не заполнил его. Вот пример того, что на самом деле является комбинацией первых двух ответов; если
toLocaleString
работает, он использует его, если нет, он использует пользовательскую функцию.источник
0.12345
будет выводить0.12,345
. Хорошая реализация для этого может быть найдена в underscore.stringvalue > 1000
если условие if исправит этот случай, однако это был случай, и, конечно, лучше протестированные версии можно найти в другом месте, спасибо за указание.value > 1000
, потому что он будет одинаковым для любого числа и более 3 десятичных знаков. например,1000.12345
возвращается1,000.12,345
. Ваш ответ отличный и на правильном пути, но просто не полный. Я только пытался указать на других людей, которые могут наткнуться на ваш ответ и просто скопировать / вставить его, не тестируя с другими входными данными.Разделитель тысяч может быть вставлен в дружественном для международного сообщества виде с помощью
Intl
объекта браузера :См. Статью MDN о NumberFormat , где вы можете указать поведение локали или значение по умолчанию для пользователя. Это немного более надежно, потому что учитывает местные различия; во многих странах для разделения цифр используются точки, а запятая обозначает десятичные дроби.
Intl.NumberFormat доступен не во всех браузерах, но работает в последних версиях Chrome, Opera и IE. Следующий релиз Firefox должен его поддерживать. У Webkit, похоже, нет графика реализации.
источник
Вы можете использовать эту процедуру для форматирования нужной вам валюты.
Для получения дополнительной информации вы можете получить доступ к этой ссылке.
https://www.justinmccandless.com/post/formatting-currency-in-javascript/
источник
если вы работаете с валютными значениями и много форматируете, то, возможно, стоит добавить крошечный accounting.js, который обрабатывает множество крайних случаев и локализацию:
источник
Следующий код использует сканирование символов, поэтому здесь нет регулярных выражений.
Это показывает многообещающую производительность: http://jsperf.com/number-formatting-with-commas/5
2015.4.26: Незначительное исправление для устранения проблемы при num <0. Смотрите https://jsfiddle.net/runsun/p5tqqvs3/
источник
commafy(-123456)
этим дает-,123,456
Вот простая функция, которая вставляет запятые для тысяч разделителей. Он использует функции массива, а не RegEx.
Ссылка CodeSandbox с примерами: https://codesandbox.io/s/p38k63w0vq
источник
Используйте этот код для обработки формата валюты для Индии. Код страны может быть изменен для обработки другой валюты страны.
вывод:
источник
Вы также можете использовать конструктор Intl.NumberFormat . Вот как вы можете это сделать.
источник
Я написал это, прежде чем наткнуться на этот пост. Нет регулярных выражений, и вы действительно можете понять код.
источник
РЕДАКТИРОВАТЬ: функция работает только с положительным числом. для примера:
Выход: "123,123,231,232"
Но для ответа на вопрос выше
toLocaleString()
метод просто решает проблему.Выход: "123,123,231,232"
Не унывайте!
источник
Мой ответ - единственный ответ, который полностью заменяет jQuery гораздо более разумной альтернативой:
Это решение не только добавляет запятые, но и округляет до ближайшей копейки, если вы
$(1000.9999)
введете сумму, равную 1 001,00 долл. США. Кроме того, введенное вами значение может безопасно представлять собой число или строку; это не важноЕсли вы имеете дело с деньгами, но не хотите, чтобы на сумме отображался ведущий знак доллара, вы также можете добавить эту функцию, которая использует предыдущую функцию, но удаляет
$
:Если вы не имеете дело с деньгами и предъявляете различные требования к десятичному форматированию, вот более универсальная функция:
Да, и, кстати, тот факт, что этот код не работает в какой-то старой версии Internet Explorer, является полностью преднамеренным. Я пытаюсь сломать IE в любое время, когда я могу его поймать, не поддерживая современные стандарты.
Пожалуйста, помните, что чрезмерная похвала в разделе комментариев считается не по теме. Вместо этого просто засыпайте меня голосами "за".
источник
Для меня лучший ответ - использовать toLocaleString, как говорили некоторые участники. Если вы хотите включить символ '$', просто добавьте язык и введите параметры. Вот и пример форматирования номера в мексиканские песо
сокращенный
источник
Позвольте мне попытаться улучшить uKolka «s ответа и , возможно , помочь другим сэкономить некоторое время.
Используйте Numeral.js .
Вы должны использовать Number.prototype.toLocaleString (), только если его совместимость с браузером не является проблемой.
источник
Альтернативный способ, поддержка десятичных знаков, различных разделителей и негативов.
Некоторые исправления @Jignesh Sanghani, не забудьте высказать свой комментарий.
источник
fn.substr(0, i)
заменить на,n.substr(0, i)
а такжеnumber.toFixed(dp).split('.')[1]
заменить наparseFloat(number).toFixed(dp).split('.')[1]
. потому что, когда я использую напрямую, это дает мне ошибку. пожалуйста, обновите свой кодЯ думаю, что эта функция позаботится обо всех проблемах, связанных с этой проблемой.
источник
Просто для будущих Googlers (или не обязательно «Googlers»):
Все решения, упомянутые выше, замечательны, однако RegExp может быть ужасно плохой вещью в такой ситуации.
Итак, да, вы можете использовать некоторые из предложенных вариантов или даже написать что-нибудь примитивное, но полезное, например:
Используемое здесь регулярное выражение довольно простое, и цикл будет идти ровно столько раз, сколько потребуется для выполнения работы.
И вы могли бы оптимизировать его гораздо лучше, код «DRYify» и так далее.
Еще,
(в большинстве ситуаций) будет гораздо лучшим выбором.
Дело не в скорости исполнения и не в кросс-браузерной совместимости.
В ситуациях, когда вы хотите показать полученное число пользователю, метод .toLocaleString () дает вам сверхспособность говорить на одном языке с пользователем вашего веб-сайта или приложения (независимо от того, какой у него язык).
Этот метод в соответствии с документацией ECMAScript был введен в 1999 году, и я считаю, что причиной этого была надежда, что Интернет в какой-то момент соединит людей во всем мире, поэтому потребовались некоторые инструменты «интернализации».
Сегодня Интернет связывает нас всех, поэтому важно помнить, что мир намного сложнее, чем мы можем себе представить, и (/ почти) все мы здесь , в Интернете.
Очевидно, что, учитывая разнообразие людей, невозможно гарантировать идеальный UX для всех, потому что мы говорим на разных языках, ценим разные вещи и т. Д. И именно из-за этого еще более важно попытаться локализовать вещи настолько, насколько это возможно. ,
Итак, учитывая, что существуют определенные стандарты для представления даты, времени, чисел и т. Д. И что у нас есть инструмент для отображения этих вещей в формате, предпочитаемом конечным пользователем, это не так уж редко и почти безответственно использовать этот инструмент (особенно в ситуациях, когда мы хотим показать эти данные пользователю)?
Для меня использование RegExp вместо .toLocaleString () в подобной ситуации звучит немного похоже на создание приложения для часов с JavaScript и его жесткое программирование таким образом, чтобы оно отображало только пражское время (что было бы совершенно бесполезно для люди, которые не живут в Праге), хотя поведение по умолчанию
вернуть данные в соответствии с конечными часами пользователя.
источник
Мое « истинное » решение только для регулярных выражений для тех, кто любит однострочники
Вы видите тех восторженных игроков выше? Может быть, вы можете играть в гольф из этого. Вот мой инсульт.
Использует
ТОНКОЕ ПРОСТРАНСТВО (U + 2009) для разделителя тысяч, как сказано в Международной системе единиц в восьмом издании (2006 г.) их публикации « Брошюра СИ: Международная система единиц (СИ) » (см. §5.3 0,4.). Девятое издание (2019) предлагает использовать пространство для него (См §5.4.4.). Вы можете использовать все, что хотите, включая запятую.
Видеть.
Как это работает?
Для целой части
.replace(……, " I ")
Поставить «я»/……/g
на каждом из\B
между двумя соседними цифрами(?=……)
ПОЗИТИВНО LOOKAHEAD , правая часть которого(\d{3})+
один или несколько трехзначных блоков\b
за которым следует нецифровка, такая как точка, конец строки и т. д.,(?<!……)
ОТРИЦАТЕЛЬНЫЙ СМОТРЕТЬ исключая тех, чья левая часть\.\d+
является точкой, за которой следуют цифры («имеет десятичный разделитель»).Для десятичной части
.replace(……, " F ")
Поставить «F»/……/g
на каждом из\B
между двумя соседними цифрами(?<=……)
ПОЗИТИВНО СМОТРЕТЬ, чья левая часть\.
десятичный разделитель(\d{3})+
сопровождаемый одним или несколькими кусками с тремя цифрами.Классы персонажей и границы
Совместимость браузера
источник
Я добавил Tofixed к решению Aki143S . Это решение использует точки для тысяч разделителей и запятую для точности.
Примеры;
источник
Я думаю, что ваше решение является одним из самых коротких, которые я видел для этого. Я не думаю, что есть какие-то стандартные функции JavaScript, чтобы делать такие вещи, так что вы, вероятно, самостоятельно.
Я проверил спецификации CSS 3, чтобы увидеть, возможно ли это сделать в CSS, но если вы не хотите, чтобы каждая цифра была отдельной
<span>
, я не думаю, что это возможно.Я нашел один проект в Google Code, который выглядел многообещающе: Flexible-JS-форматирование . Я не использовал его, но он выглядит довольно гибким и имеет модульные тесты с использованием JsUnit . У разработчика также есть много постов (хотя и старых) на эту тему.
Обязательно учитывайте международных пользователей: многие страны используют пробел в качестве разделителя и используют запятую для отделения десятичной дроби от целой части числа.
источник