Я пытаюсь напечатать целое число в Википедия — & gt ; Javascript — & gt ; Security ) в

JS

function numberWithCommas(x) {
    x = x.toString();
    var pattern = /(-?d )(d{3})/;
    while (pattern.test(x))
        x = x.replace(pattern, "$1,$2");
    return x;
}

Есть ли более простой или более элегантный способ сделать это? Было бы хорошо, если бы он работал и с поплавками, но это не обязательно. Он не должен зависеть от локали, чтобы выбирать между точками и запятыми.

Я использовал идею из ответа Керри, но упростил ее, так как я просто искал что-то простое для моей конкретной цели. Вот что я сделал:

function numberWithCommas(x) {
    return x.toString().replace(/B(?=(d{3}) (?!d))/g, ",");
}

Лучше использовать последовательный

@ Neils Bom спросил, как работает регулярное выражение. Мое объяснение довольно длинное. Это не помещается в комментариях, и я не знаю, куда еще поместить это, таким образом, я делаю это здесь. Если у кого-то есть какие-либо предложения относительно того, где его поставить, пожалуйста, дайте мне знать.

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

Например, если вы передадите ему «123456789.01», положительное утверждение будет совпадать с каждой точкой слева от 7 (поскольку «789» кратно 3 цифрам, «678» кратно 3 цифрам », 567 «и т. Д.). Отрицательное утверждение проверяет, что кратное 3 цифрам не имеет никаких цифр после него. «789» имеет точку после него, так что она в точности кратна 3 цифрам, поэтому запятая идет туда. «678» является кратным 3 цифрам, но после него стоит «9», поэтому эти 3 цифры являются частью группы из 4, и запятая здесь не идет. Аналогично для «567». «456789» — это 6 цифр, что кратно 3, поэтому перед этим стоит запятая. «345678» — это кратное 3, но после него стоит «9», поэтому запятая не идет. И так далее. » B» не позволяет регулярному выражению ставить запятую в начале строки.

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

function numberWithCommas(x) {
    var parts = x.toString().split(".");
    parts[0] = parts[0].replace(/B(?=(d{3}) (?!d))/g, ",");
    return parts.join(".");
}

http://www.greywyvern.com/?post=331 Number.prototype.toLocaleString . Она реализована в JavaScript 1.5 (которая была представлена ​​в 1999 году), поэтому она в основном поддерживается во всех основных браузерах.

var n = 34523453.345
n.toLocaleString()
"34,523,453.345"

Это также работает в Node.js начиная с v0.12 посредством включения Предположим, что ваша HTML-форма имеет

Просто обратите внимание, что эта функция возвращает строку, а не число.

javascript — определите содержит ли массив va lue — переполнение стека Это позволяет вам сделать реальный , может быть интересным.

var number = 1234567890; // Example number to be converted

для поддержки всех последних оставшихся IE пользователи (опять же, может быть, нам следует прекратить это делать). максимальное целое число должен был бы. 9007199254740991


Конечно, вышеупомянутые реализации умны и кратки, но используют :

number.toLocaleString(); // "1,234,567,890"

// A more complex example: 
var number2 = 1234.56789; // floating point example
number2.toLocaleString(undefined, {maximumFractionDigits:2}) // "1,234.57"

, который показывает пример: ( Safari не поддерживается):

var nf = new Intl.NumberFormat();
nf.format(number); // "1,234,567,890"

Из того, что я проверял (по крайней мере, для Firefox), они более или менее одинаковы по поводу производительности.

, я предлагаю использовать phpjs.org’s number_format ()

function number_format(number, decimals, dec_point, thousands_sep) {
    // http://kevin.vanzonneveld.net
    //     original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    //     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    //       bugfix by: Michael White (http://getsprink.com)
    //       bugfix by: Benjamin Lupton
    //       bugfix by: Allan Jensen (http://www.winternet.no)
    //      revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    //       bugfix by: Howard Yeend
    //      revised by: Luke Smith (http://lucassmith.name)
    //       bugfix by: Diogo Resende
    //       bugfix by: Rival
    //        input by: Kheang Hok Chin (http://www.distantia.ca/)
    //     improved by: davook
    //     improved by: Brett Zamir (http://brett-zamir.me)
    //        input by: Jay Klehr
    //     improved by: Brett Zamir (http://brett-zamir.me)
    //        input by: Amir Habibi (http://www.residence-mixte.com/)
    //       bugfix by: Brett Zamir (http://brett-zamir.me)
    //     improved by: Theriault
    //     improved by: Drew Noakes
    // *     example 1: number_format(1234.56);
    // *     returns 1: '1,235'
    // *     example 2: number_format(1234.56, 2, ',', ' ');
    // *     returns 2: '1 234,56'
    // *     example 3: number_format(1234.5678, 2, '.', '');
    // *     returns 3: '1234.57'
    // *     example 4: number_format(67, 2, ',', '.');
    // *     returns 4: '67,00'
    // *     example 5: number_format(1000);
    // *     returns 5: '1,000'
    // *     example 6: number_format(67.311, 2);
    // *     returns 6: '67.31'
    // *     example 7: number_format(1000.55, 1);
    // *     returns 7: '1,000.6'
    // *     example 8: number_format(67000, 5, ',', '.');
    // *     returns 8: '67.000,00000'
    // *     example 9: number_format(0.9, 0);
    // *     returns 9: '1'
    // *    example 10: number_format('1.20', 2);
    // *    returns 10: '1.20'
    // *    example 11: number_format('1.20', 4);
    // *    returns 11: '1.2000'
    // *    example 12: number_format('1.2000', 3);
    // *    returns 12: '1.200'
    var n = !isFinite( number) ? 0 :  number, 
        prec = !isFinite( decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        toFixedFix = function (n, prec) {
            // Fix for IE parseFloat(0.55).toFixed(0) = 0;
            var k = Math.pow(10, prec);
            return Math.round(n * k) / k;
        },
        s = (prec ? toFixedFix(n, prec) : Math.round(n)).toString().split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/B(?=(?:d{3}) (?!d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1]  = new Array(prec - s[1].length   1).join('0');
    }
    return s.join(dec);
}

ОБНОВЛЕНИЕ 13.02.14

Люди сообщают, что это работает не так, как ожидалось, поэтому я сделал JS Fiddle , который включает в себя автоматические тесты.

Обновление 26/11/2017 Вот эта скрипка в виде фрагмента стека с немного измененным выводом:

Это вариант ответа @ mikez302, но измененный для поддержки чисел с десятичными числами (согласно отзывам @ neu-rah, numberWithCommas (12345.6789) — & Gt ; «12 345 6 789» вместо «12 345,6789»

function number_format(number, decimals, dec_point, thousands_sep) {
    // http://kevin.vanzonneveld.net
    //     original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    //     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    //       bugfix by: Michael White (http://getsprink.com)
    //       bugfix by: Benjamin Lupton
    //       bugfix by: Allan Jensen (http://www.winternet.no)
    //      revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    //       bugfix by: Howard Yeend
    //      revised by: Luke Smith (http://lucassmith.name)
    //       bugfix by: Diogo Resende
    //       bugfix by: Rival
    //        input by: Kheang Hok Chin (http://www.distantia.ca/)
    //     improved by: davook
    //     improved by: Brett Zamir (http://brett-zamir.me)
    //        input by: Jay Klehr
    //     improved by: Brett Zamir (http://brett-zamir.me)
    //        input by: Amir Habibi (http://www.residence-mixte.com/)
    //       bugfix by: Brett Zamir (http://brett-zamir.me)
    //     improved by: Theriault
    //     improved by: Drew Noakes
    // *     example 1: number_format(1234.56);
    // *     returns 1: '1,235'
    // *     example 2: number_format(1234.56, 2, ',', ' ');
    // *     returns 2: '1 234,56'
    // *     example 3: number_format(1234.5678, 2, '.', '');
    // *     returns 3: '1234.57'
    // *     example 4: number_format(67, 2, ',', '.');
    // *     returns 4: '67,00'
    // *     example 5: number_format(1000);
    // *     returns 5: '1,000'
    // *     example 6: number_format(67.311, 2);
    // *     returns 6: '67.31'
    // *     example 7: number_format(1000.55, 1);
    // *     returns 7: '1,000.6'
    // *     example 8: number_format(67000, 5, ',', '.');
    // *     returns 8: '67.000,00000'
    // *     example 9: number_format(0.9, 0);
    // *     returns 9: '1'
    // *    example 10: number_format('1.20', 2);
    // *    returns 10: '1.20'
    // *    example 11: number_format('1.20', 4);
    // *    returns 11: '1.2000'
    // *    example 12: number_format('1.2000', 3);
    // *    returns 12: '1.200'
    var n = !isFinite( number) ? 0 :  number, 
        prec = !isFinite( decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        toFixedFix = function (n, prec) {
            // Fix for IE parseFloat(0.55).toFixed(0) = 0;
            var k = Math.pow(10, prec);
            return Math.round(n * k) / k;
        },
        s = (prec ? toFixedFix(n, prec) : Math.round(n)).toString().split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/B(?=(?:d{3}) (?!d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1]  = new Array(prec - s[1].length   1).join('0');
    }
    return s.join(dec);
}

var exampleNumber = 1;
function test(expected, number, decimals, dec_point, thousands_sep)
{
    var actual = number_format(number, decimals, dec_point, thousands_sep);
    console.log(
        'Test case '   exampleNumber   ': '  
        '(decimals: '   (typeof decimals === 'undefined' ? '(default)' : decimals)  
        ', dec_point: "'   (typeof dec_point === 'undefined' ? '(default)' : dec_point)   '"'  
        ', thousands_sep: "'   (typeof thousands_sep === 'undefined' ? '(default)' : thousands_sep)   '")'
    );
    console.log('  => '   (actual === expected ? 'Passed' : 'FAILED')   ', got "'   actual   '", expected "'   expected   '".');
    exampleNumber  ;
}

test('1,235',    1234.56);
test('1 234,56', 1234.56, 2, ',', ' ');
test('1234.57',  1234.5678, 2, '.', '');
test('67,00',    67, 2, ',', '.');
test('1,000',    1000);
test('67.31',    67.311, 2);
test('1,000.6',  1000.55, 1);
test('67.000,00000', 67000, 5, ',', '.');
test('1',        0.9, 0);
test('1.20',     '1.20', 2);
test('1.2000',   '1.20', 4);
test('1.200',    '1.2000', 3);
.as-console-wrapper {
  max-height: 100% !important;
}

Использование регулярного выражения

function numberWithCommas(n) {
    var parts=n.toString().split(".");
    return parts[0].replace(/B(?=(d{3}) (?!d))/g, ",")   (parts[1] ? "."   parts[1] : "");
}
function formatNumber (num) {
    return num.toString().replace(/(d)(?=(d{3}) (?!d))/g, "$1,")
}

print(formatNumber(2665));      // 2,665
print(formatNumber(102665));    // 102,665
print(formatNumber(111102665)); // 111,102,665

DEMO AT HERE

function toCommas(value) {
    return value.toString().replace(/B(?=(d{3}) (?!d))/g, ",");
}
console.log(toCommas(123456789)); // 123,456,789

console.log(toCommas(1234567890)); // 1,234,567,890
console.log(toCommas(1234)); // 1,234

Узел 7.4 теперь поддерживает асинхронный / жду звонков с флагом гармонии.

var number = 123456.789;

// request a currency format
console.log(number.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' }));
// → 123.456,79 €

// the Japanese yen doesn't use a minor unit
console.log(number.toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' }))
// → ¥123,457

// limit to three significant digits
console.log(number.toLocaleString('en-IN', { maximumSignificantDigits: 3 }));
// → 1,23,000

Ад нет. Это самый быстрый способ итерации, если вы зацикливаетесь на разреженных массивах, которые время от времени необходимы. Это один из самых важных приемов производительности, которые нужно знать. Давайте посмотрим на пример. Мы будем зацикливаться на разреженном массиве. MDN: Number.prototype.toLocaleString ()

применима к циклам. Похоже, это специфично для

var number = 123456.789;

console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(number));
// expected output: "123.456,79 €"

// the Japanese yen doesn't use a minor unit
console.log(new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' }).format(number));
// expected output: "¥123,457"

// limit to three significant digits
console.log(new Intl.NumberFormat('en-IN', { maximumSignificantDigits: 3 }).format(number));

// expected output: "1,23,000"

Ад нет. Это самый быстрый способ итерации, если вы зацикливаетесь на разреженных массивах, которые время от времени необходимы. Это один из самых важных приемов производительности, которые нужно знать. Давайте посмотрим на пример. Мы будем зацикливаться на разреженном массиве. и элементы

Performance

<script type="text/javascript">
  // Using Regular expression
  function toCommas(value) {
    return value.toString().replace(/B(?=(d{3}) (?!d))/g, ",");
  }

  function commas() {
    var num1 = document.myform.number1.value;

    // Using Regular expression
    document.getElementById('result1').value = toCommas(parseInt(num1));
    // Using toLocaleString()

    document.getElementById('result2').value = parseInt(num1).toLocaleString('ja-JP', {
      style: 'currency',
      currency: 'JPY'
    });

    // Using Intl.NumberFormat()
    document.getElementById('result3').value = new Intl.NumberFormat('ja-JP', {
      style: 'currency',
      currency: 'JPY'
    }).format(num1);
  }
</script>
<FORM NAME="myform">
  <INPUT TYPE="text" NAME="number1" VALUE="123456789">
  <br>
  <INPUT TYPE="button" NAME="button" Value="=>" onClick="commas()">
  <br>Using Regular expression
  <br>
  <INPUT TYPE="text" ID="result1" NAME="result1" VALUE="">
  <br>Using toLocaleString()
  <br>
  <INPUT TYPE="text" ID="result2" NAME="result2" VALUE="">
  <br>Using Intl.NumberFormat()
  <br>
  <INPUT TYPE="text" ID="result3" NAME="result3" VALUE="">

</FORM>

javascript — Почему document.write считается «плохой практикой»? — Стек Переполнение

Performance http://jsben.ch/sifRd

и элементы

Спасибо всем за ответы. Я собрал некоторые ответы чтобы сделать более универсальное решение.

var number = 3500;

console.log(new Intl.NumberFormat().format(number));
// → '3,500' if in US English locale

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

последнюю ветвь вашего пространства имен содержит функцию as PHP использовать number_format() Я думаю, что это самое короткое регулярное выражение, которое делает это:

Number.prototype.numberFormat = function(decimals, dec_point, thousands_sep) {
    dec_point = typeof dec_point !== 'undefined' ? dec_point : '.';
    thousands_sep = typeof thousands_sep !== 'undefined' ? thousands_sep : ',';

    var parts = this.toFixed(decimals).split('.');
    parts[0] = parts[0].replace(/B(?=(d{3}) (?!d))/g, thousands_sep);

    return parts.join(dec_point);
}

Вы бы использовали это следующим образом:

var foo = 5000;
console.log(foo.numberFormat(2)); // us format: 5,000.00
console.log(foo.numberFormat(2, ',', '.')); // european format: 5.000,00

современный подход

String.prototype.getFloat = function(dec_point, thousands_sep) {
    dec_point = typeof dec_point !== 'undefined' ? dec_point : '.';
    thousands_sep = typeof thousands_sep !== 'undefined' ? thousands_sep : ',';

    var parts = this.split(dec_point);
    var re = new RegExp("["   thousands_sep   "]");
    parts[0] = parts[0].replace(re, '');

    return parseFloat(parts.join(dec_point));
}

Теперь вы можете использовать обе функции следующим образом:

var foo = 5000;
var fooString = foo.numberFormat(2); // The string 5,000.00
var fooFloat = fooString.getFloat(); // The number 5000;

console.log((fooString.getFloat()   1).numberFormat(2)); // The string 5,001.00

Несколько из более серьезных проблем:

/B(?=(d{3}) b)/g

"123456".replace(/B(?=(d{3}) b)/g, ",")

было бы замечательно, если бы он предоставлялся изначально всеми браузерами

Number.prototype.toLocaleString() (Safari) (пытаясь найти подтверждение этому, но в лучшем случае это ситуативно) Глядя на вывод

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

var putThousandsSeparators;

putThousandsSeparators = function(value, sep) {
  if (sep == null) {
    sep = ',';
  }
  // check if it needs formatting
  if (value.toString() === value.toLocaleString()) {
    // split decimals
    var parts = value.toString().split('.')
    // format whole numbers
    parts[0] = parts[0].replace(/B(?=(d{3}) (?!d))/g, sep);
    // put them back together
    value = parts[1] ? parts.join('.') : parts[0];
  } else {
    value = value.toLocaleString();
  }
  return value;
};

alert(putThousandsSeparators(1234567.890));

: Intl MDN статья о NumberFormat

Intl.NumberFormat().format(1234);
// returns "1,234" if the user's locale is en_US, for example

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

Intl.NumberFormat доступен не во всех браузерах, но работает в последних версиях Chrome, Opera, & Amp ; IE. Следующий релиз Firefox должен его поддерживать. У Webkit, похоже, нет графика реализации.

Вы можете использовать эту процедуру для форматирования нужной вам валюты.

var nf = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
  minimumFractionDigits: 2,
  maximumFractionDigits: 2
});
nf.format(123456.789); // ‘$123,456.79’

не перезаписывает существующие обработчики событий, тогда как

Если вы не пытаетесь использовать его после загрузки документа,

если вы работаете с валютными значениями и много форматируете, возможно, стоит добавить крошечный accounting.js Еще одно законное использование указывает на глобальный объект:

// Default usage:
accounting.formatMoney(12345678); // $12,345,678.00

// European formatting (custom symbol and separators), could also use options object as second param:
accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99

// Negative values are formatted nicely, too:
accounting.formatMoney(-500000, "£ ", 0); // £ -500,000

// Simple `format` string allows control of symbol position [%v = value, %s = symbol]:
accounting.formatMoney(5318008, { symbol: "GBP",  format: "%v %s" }); // 5,318,008.00 GBP

Ну, я использовал curl в PHP, чтобы обойти это. У меня есть веб-служба, работающая в порту 82.

function commafy( num){
  var parts = ('' (num<0?-num:num)).split("."), s=parts[0], L, i=L= s.length, o='';
  while(i--){ o = (i===0?'':((L-i)%3?'':',')) 
                   s.charAt(i)  o }
  return (num<0?'-':'')   o   (parts[1] ? '.'   parts[1] : ''); 
}

Показывает многообещающую производительность: json2.js

2015.4.26: Незначительное исправление для устранения проблемы при num & lt ; 0. Смотрите , вам не нужно обещать что-либо. Возвращение обещания из метода

Вот простая функция, которая вставляет запятые для тысяч разделителей. Она использует функции массива, а не RegEx.

/**
 * Format a number as a string with commas separating the thousands.
 * @param num - The number to be formatted (e.g. 10000)
 * @return A string representing the formatted number (e.g. "10,000")
 */
var formatNumber = function(num) {
    var array = num.toString().split('');
    var index = -3;
    while (array.length   index > 0) {
        array.splice(index, 0, ',');
        // Decrement by 4 since we just added another unit to the array.
        index -= 4;
    }
    return array.join('');
};

Ссылка CodeSandbox с примерами: в качестве логического места для

Я написал его перед тем, как наткнуться на этот пост. Нет регулярных выражений, и вы действительно можете понять код.

$(function(){
  
  function insertCommas(s) {

    // get stuff before the dot
    var d = s.indexOf('.');
    var s2 = d === -1 ? s : s.slice(0, d);

    // insert commas every 3 digits from the right
    for (var i = s2.length - 3; i > 0; i -= 3)
      s2 = s2.slice(0, i)   ','   s2.slice(i);

    // append fractional part
    if (d !== -1)
      s2  = s.slice(d);

    return s2;

  }
  
  
  $('#theDudeAbides').text( insertCommas('1234567.89012' ) );
  
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div id="theDudeAbides"></div>

Для меня лучший ответ — использовать toLocaleString, как говорили некоторые члены. Если вы хотите включить символ «$», просто добавьте язык и тип опций. Вот пример и пример форматирования числа в мексиканских песо.

var n = 1234567.22
alert(n.toLocaleString("es-MX",{style:"currency", currency:"MXN"}))

У меня та же проблема, и я нашел более простой способ ее решения с помощью html и css.

1234567.22.toLocaleString("es-MX",{style:"currency", currency:"MXN"})

Позвольте мне попытаться улучшить uKolka Con: будут выведены на консоль: и, возможно, помогут другим сэкономить время.

Использование Это позволяет вам сделать реальный Глядя на вывод

document.body.textContent = numeral(1234567).format('0,0');
<script src="//cdnjs.cloudflare.com/ajax/libs/numeral.js/1.4.5/numeral.min.js"></script>

Вы должны использовать Наконец, для всестороннего объяснения, что может быть проблемами с использованием хешей (и хешбангов), ознакомьтесь с , только если его это не проблема. РЕДАКТИРОВАТЬ: функция работает только с положительным числом. for exmaple:

var formatNumber = function (number) {
  var splitNum;
  number = Math.abs(number);
  number = number.toFixed(2);
  splitNum = number.split('.');
  splitNum[0] = splitNum[0].replace(/B(?=(d{3}) (?!d))/g, ",");
  return splitNum.join(".");
}

Очевидно, что это не сработает в XHTML, но, поскольку XHTML кажется чем-то вроде мертвой утки (и выводится как теговый суп в IE), возможно, стоит пересмотреть ваш выбор DOCTYPE …

var number = -123123231232;
formatNumber(number)

Вывод: «123,123,231,232»

функция распространит аргументы в конструкторе. Для пояснения, делая toLocaleString(), что вы не делаете, или если вы копируете

var number = 123123231232;
    number.toLocaleString()

Вывод: «123,123,231,232»

: некоторые браузеры переключаются обратно на рендеринг HTML, и все работает нормально.

output:

let amount =350256.95
var formatter = new Intl.NumberFormat('en-IN', {
  minimumFractionDigits: 2,
});

// Use it.

formatter.format(amount);

Я добавил tofixed к

3,50,256.95

Я думаю, что эта функция позаботится обо всех проблемах, связанных с этой проблемой.

function commaFormat(inputString) {
    inputString = inputString.toString();
    var decimalPart = "";
    if (inputString.indexOf('.') != -1) {
        //alert("decimal number");
        inputString = inputString.split(".");
        decimalPart = "."   inputString[1];
        inputString = inputString[0];
        //alert(inputString);
        //alert(decimalPart);

    }
    var outputString = "";
    var count = 0;
    for (var i = inputString.length - 1; i >= 0 && inputString.charAt(i) != '-'; i--) {
        //alert("inside for"   inputString.charAt(i)   "and count="   count   " and outputString="   outputString);
        if (count == 3) {
            outputString  = ",";
            count = 0;
        }
        outputString  = inputString.charAt(i);
        count  ;
    }
    if (inputString.charAt(0) == '-') {
        outputString  = "-";
    }
    //alert(outputString);
    //alert(outputString.split("").reverse().join(""));
    return outputString.split("").reverse().join("")   decimalPart;
}

. Несмотря на это, вы на самом деле не используете DOM, когда используете document.write — вы просто добавляете в текст большую часть текста, поэтому я бы сказал, это плохая форма. Оба должны быть полностью совместимы с версией браузера. Довольно поздно. На всякий случай, если это кому-нибудь поможет.

function formatNumber( num, fixed ) { 
    var decimalPart;

    var array = Math.floor(num).toString().split('');
    var index = -3; 
    while ( array.length   index > 0 ) { 
        array.splice( index, 0, '.' );              
        index -= 4;
    }

    if(fixed > 0){
        decimalPart = num.toFixed(fixed).split(".")[1];
        return array.join('')   ","   decimalPart; 
    }
    return array.join(''); 
};

Примеры ;

formatNumber(17347, 0)  = 17.347
formatNumber(17347, 3)  = 17.347,000
formatNumber(1234563.4545, 3)  = 1.234.563,454

много хороших ответов уже. Вот еще одно, просто для удовольствия:

function format(num, fix) {
    var p = num.toFixed(fix).split(".");
    return p[0].split("").reduceRight(function(acc, num, i, orig) {
        if ("-" === num && 0 === i) {
            return num   acc;
        }
        var pos = orig.length - i - 1
        return  num   (pos && !(pos % 3) ? "," : "")   acc;
    }, "")   (p[1] ? "."   p[1] : "");
}

необходимо использовать при загрузке страницы или загрузке тела. Поэтому, если вы хотите использовать скрипт в любое другое время для обновления содержимого страницы, document.write в значительной степени бесполезен.

format(77.03453, 2); // "77.03"
format(78436589374); // "78,436,589,374"
format(784, 4);      // "784.0000"
format(-123456);     // "-123,456"

Решение от @ user1437663 отличное.

http://www.w3.org/MarkUp/2004/xhtml-faq # docwrite

Небольшое улучшение, чтобы сделать его более читабельным:

function numberWithCommas(x) {
    var parts = x.toString().split(".");
    return parts[0].replace(/B(?=(d{3}) (?=$))/g, ",")   (parts[1] ? "."   parts[1] : "");
}

Шаблон начинается с метода B не продвигает «курсор» (то же самое относится к B на основе анализа, выполненного Google-Chrome Dev Tools. $ ).

O B Во всех браузерах. Он поддерживается в Chrome с 1.0.

            Pattern1 (? = (Pattern2) ).

Магия в том, что в скобках ( Но как насчет этого ?: Pattern1 http://jsbin.com/ ) но без перемещения курсора, а также не является частью возвращаемого шаблона. Это своего рода модель будущего. Это похоже на то, когда кто-то смотрит вперед, но на самом деле не идет!

В этом случае Но как насчет этого ?: ,

d{3}) (?=$)

Текст = Hello World

если вам не нужны пробелы, вы можете удалить этот метод «если» , это пример того, как получить значения: Это намного более мощный способ Не динамический контент с

Я думаю, что ваше решение — одно из самых коротких, которые я видел для этого. Я не думаю, что есть какие-то стандартные функции JavaScript, чтобы делать такие вещи, так что вы, вероятно, самостоятельно.

ajax jQuery <span> это выглядело многообещающе:

я нашел один проект на конструкторе (также см. b) Рендеринг событие Flexible-js-formatting . Я не использовал его, но он выглядит довольно гибким и имеет модульные тесты, использующие Отвечает ли какой-либо из текущих браузеров на Обязательно учитывайте международных пользователей: многие страны используют пробел в качестве разделителя и используют запятую для отделения десятичной дроби от целой части числа.

Чтобы использовать это, просто добавили два события — onKeyUp и onKeyDown

, я адаптировал ваш код для работы в TextBox (Тип ввода = «текст»), чтобы мы могли вводить и удалять цифры в реальном времени, не теряя курсора. Это работает также, если вы выбираете диапазон при удалении. И вы можете свободно использовать стрелки и кнопки домой / конец.
Спасибо, что сэкономили мое время!

//function controls number format as "1,532,162.3264321"
function numberWithCommas(x) {
    var e = e || window.event;
    if (e.keyCode >= '35' && e.keyCode <= '40') return; //skip arrow-keys
    var selStart = x.selectionStart, selEnd = x.selectionEnd; //save cursor positions
    var parts = x.value.toString().split(".");
    var part0len = parts[0].length; //old length to check if new ',' would be added. Need for correcting new cursor position ( 1 to right).

    //if user deleted ',' - remove previous number instead (without selection)
    if (x.selectionLength == 0 && (e.keyCode == 8 || e.keyCode == 46)) {//if pressed 8-backspace or 46-delete button
        var delPos = parts[0].search(/d{4}/);
        if (delPos != -1) {//if found 4 digits in a row (',' is deleted)
            if (e.keyCode == 8) {//if backspace flag
                parts[0] = parts[0].slice(0, selStart - 1)   parts[0].slice(selEnd, parts[0].length);
                selEnd--;
                if (selStart > selEnd) selStart = selEnd;
            } else {
                parts[0] = parts[0].slice(0, selStart)   parts[0].slice(selEnd   1, parts[0].length);
                selStart  ;
                if (selEnd < selStart) selEnd = selStart;
            }
        }
    }

   var hasMinus = parts[0][0] == '-';
   parts[0] = (hasMinus ? '-' : '')   parts[0].replace(/[^d]*/g, ""); //I'd like to clear old ',' to avoid things like 1,2,3,5,634.443216
   parts[0] = parts[0].replace(/B(?=(d{3}) (?!d))/g, ","); //sets ',' between each 3 digits
   if (part0len < parts[0].length) { //move cursor to right if added new ','
       selStart  ;
       selEnd  ;
   } else if (part0len > parts[0].length) { //..or if removed last one ','
       selStart--;
       selEnd--;
   }
   x.value = parts.join(".");
   x.setSelectionRange(selStart, selEnd); //restoring cursor position
}
function saveSelectionLength(x) {
    x.selectionLength = x.selectionEnd - x.selectionStart;
}

Если вы используете AngularJS, есть такой валютный фильтр, который может определенно помочь:

<asp:TextBox runat="server" ID="val" Width="180px" onKeyUp="numberWithCommas(this);" onKeyDown="saveSelectionLength(this);"/>

Самое большое последствие использования такого метода — снижение производительности. Для загрузки содержимого страницы браузеру потребуется больше времени. Неблагоприятная реакция на время загрузки зависит от того, что записывается в документ. Вы не увидите большой разницы, если добавите http://www.w3schools.com/angular/ng_filter_currency.asp

Вот моя попытка:

метод:

function splitMille(n, separator = ',') {
  // Cast to string
  let num = (n   '')

  // Test for and get any decimals (the later operations won't support them)
  let decimals = ''
  if (/./.test(num)) {
    // This regex grabs the decimal point as well as the decimal numbers
    decimals = num.replace(/^.*(..*)$/, '$1')
  }
  
  // Remove decimals from the number string
  num = num.replace(decimals, '')
    // Reverse the number string through Array functions
    .split('').reverse().join('')
    // Split into groups of 1-3 characters (with optional supported character "-" for negative numbers)
    .match(/[0-9]{1,3}-?/g)
    // Add in the mille separator character and reverse back
    .join(separator).split('').reverse().join('')

  // Put the decimals back and output the formatted number
  return `${num}${decimals}`
}

let testA = splitMille(1234)
let testB = splitMille(-1234)
let testC = splitMille(123456.789)
let testD = splitMille(9007199254740991)
let testE = splitMille(1000.0001)

console.log('Results!ntA: %sntB: %sntC: %sntD: %sntE: %s', testA, testB, testC, testD, testE)

Текст

    function numberWithCommas(x) {
        return (x=x '').replace(new RegExp('\B(?=(\d{3}) ' (~x.indexOf('.')?'\.':'$') ')','g'),',');
    }