Обновлено с помощью вспомогательной поддержки в соответствии с изменениями ECMAScript2018.
Для обратной совместимости прокрутите дальше вниз, чтобы увидеть оригинальное решение.
Можно использовать регулярное выражение -особенно полезно иметь дело с большими числами, хранящимися как строки.
const format = num =>
String(num).replace(/(?<!\..*)(\d)(?=(?:\d{3})+(?:\.|$))/g, '$1,')
;[
format(100), // "100"
format(1000), // "1,000"
format(1e10), // "10,000,000,000"
format(1000.001001), // "1,000.001001"
format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
.forEach(n => console.log(n))
"Подробное объяснение регулярных выражений (regex101.com)
Этот оригинальный ответ может не требоваться, но может использоваться для обратной совместимости.
Попытка обработать это с помощью одного регулярного выражения (без обратного вызова) моя текущая способность не помогает мнеотсутствие негативного оглядки в Javascript ... тем не менее, вот еще одна краткая альтернатива, которая работает в большинстве общих случаев - учет любой десятичной точки путем игнорирования совпадений, когда индекс совпадения появляется после индекса периода.
const format = num => {
const n = String(num),
p = n.indexOf('.')
return n.replace(
/\d(?=(?:\d{3})+(?:\.|$))/g,
(m, i) => p < 0 || i < p ? `${m},` : m
)
}
;[
format(100), // "100"
format(1000), // "1,000"
format(1e10), // "10,000,000,000"
format(1000.001001), // "1,000.001001"
format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
.forEach(n => console.log(n))
"Подробное объяснение регулярных выражений (regex101.com)