Javascript тысячный разделитель / строковый формат


есть ли функция в Javascript для форматирования числа и строк ?

Я ищу способ для разделитель для строк или чисел... (Как Струна.Формат в c#)

12 63

12 ответов:

обновление (7 лет спустя)

ссылка, приведенная в исходном ответе ниже, была неправильной. Там и встроенная функция для этого, а именно Кайзер предполагает ниже: toLocaleString

так что вы можете сделать:

(1234567.89).toLocaleString('en')              // for numeric input
parseFloat("1234567.89").toLocaleString('en')  // for string input

функция, реализованная ниже, тоже работает, но просто не нужна.

(Я думал, что, возможно, мне повезет и я узнаю, что это был необходимо вернуться в 2010, но нет. Согласно этому более надежная ссылка, toLocaleString был частью стандарта с ECMAScript 3rd Edition [1999], что, по моему мнению, означает, что он был бы поддержан еще в IE 5.5.)


Оригинальный Ответ

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

function addCommas(nStr) {
    nStr += '';
    var x = nStr.split('.');
    var x1 = x[0];
    var x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
            x1 = x1.replace(rgx, '' + ',' + '');
    }
    return x1 + x2;
}

Edit: Чтобы пойти другим путем (преобразовать строку с запятыми в число), вы можете сделать что-то вроде этого:

parseFloat("1,234,567.89".replace(/,/g,''))

если о локализация тысячи разделителей, разделителей и десятичных разделителей, идут со следующим:

// --> numObj.toLocaleString( [locales [, options] ] )
parseInt( number ).toLocaleString();

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

number = 123456.7089;

result  = parseInt( number ).toLocaleString() + "<br>";
result += number.toLocaleString( 'de-DE' ) + "<br>";
result += number.toLocaleString( 'ar-EG' ) + "<br>";
result += number.toLocaleString( 'ja-JP', { 
  style           : 'currency',
  currency        : 'JPY',
  currencyDisplay : 'symbol',
  useGrouping     : true
} ) + "<br>";
result += number.toLocaleString( [ 'jav', 'en' ], { 
  localeMatcher            : 'lookup',
  style                    : 'decimal',
  minimumIntegerDigits     : 2,
  minimumFractionDigits    : 2,
  maximumFractionDigits    : 3,
  minimumSignificantDigits : 2,
  maximumSignificantDigits : 3
} ) + "<br>";

var el = document.getElementById( 'result' );
el.innerHTML = result;
<div id="result"></div>

подробнее о MDN info page.

Edit: авторов комментариев @мне нравится Серена добавляет следующее:

для поддержки браузеров с a неанглийский язык, где мы все еще хотим английское форматирование, используйте value.toLocaleString('en'). Также работает для плавающей точки.

пытается справиться с этим с помощью одного регулярного выражения (без обратного вызова) моя текущая способность подводит меня из-за отсутствия негативного взгляда в 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"
]
    .forEach(n => console.log(n))

" подробное объяснение регулярных выражений (regex101.com)

flow diagram

есть хороший плагин jQuery номер:https://github.com/teamdf/jquery-number

Это позволяет изменить любое число в формате, который вам нравится, с опциями для десятичных цифр и разделителей символов для десятичных и тысяч:

$.number(12345.4556, 2);          // -> 12,345.46
$.number(12345.4556, 3, ',', ' ') // -> 12 345,456

вы можете использовать его внутри полей ввода напрямую, что лучше, используя те же параметры, что и выше:

$("input").number(true, 2);

или вы можете применить к целому набору элементов DOM с помощью селектора:

$('span.number').number(true, 2);
// thousand separates a digit-only string using commas
// by element:  onkeyup = "ThousandSeparate(this)"
// by ID:       onkeyup = "ThousandSeparate('txt1','lbl1')"
function ThousandSeparate()
{
    if (arguments.length == 1)
    {
        var V = arguments[0].value;
        V = V.replace(/,/g,'');
        var R = new RegExp('(-?[0-9]+)([0-9]{3})'); 
        while(R.test(V))
        {
            V = V.replace(R, ',');
        }
        arguments[0].value = V;
    }
    else  if ( arguments.length == 2)
    {
        var V = document.getElementById(arguments[0]).value;
        var R = new RegExp('(-?[0-9]+)([0-9]{3})'); 
        while(R.test(V))
        {
            V = V.replace(R, ',');
        }
        document.getElementById(arguments[1]).innerHTML = V;
    }
    else return false;
}   

Я использую этот:

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

источник: ссылке

вы можете использовать javascript. ниже приведен код, он будет только accept числовые и один dot

вот javascript

<script >

            function FormatCurrency(ctrl) {
                //Check if arrow keys are pressed - we want to allow navigation around textbox using arrow keys
                if (event.keyCode == 37 || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 40) {
                    return;
                }

                var val = ctrl.value;

                val = val.replace(/,/g, "")
                ctrl.value = "";
                val += '';
                x = val.split('.');
                x1 = x[0];
                x2 = x.length > 1 ? '.' + x[1] : '';

                var rgx = /(\d+)(\d{3})/;

                while (rgx.test(x1)) {
                    x1 = x1.replace(rgx, '' + ',' + '');
                }

                ctrl.value = x1 + x2;
            }

            function CheckNumeric() {
                return event.keyCode >= 48 && event.keyCode <= 57 || event.keyCode == 46;
            }

  </script>

HTML

<input type="text" onkeypress="return CheckNumeric()" onkeyup="FormatCurrency(this)" />

DEMO JSFIDDLE

number = 123456.7089;
result = parseInt( number ).toLocaleString() + "<br>";
result = number.toLocaleString( 'pt-BR' ) + "<br>";

var el = document.getElementById( 'result' );
el.innerHTML = result;
<div id="result"></div>
var number = 35002343;

console.log(number.toLocaleString());

для справки вы можете увидеть здесь https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString

PHP.js имеет функцию для этого под названием number_format. Если вы знакомы с PHP он работает точно так же.

все, что вам нужно сделать, это просто этой:

123000.9123.toLocaleString()
//result will be "123,000.912"

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

function getFormattedCurrency(num) {
    num = num.toFixed(2)
    var cents = (num - Math.floor(num)).toFixed(2);
    return Math.floor(num).toLocaleString() + '.' + cents.split('.')[1];
}