Есть ли в Javascript какая-либо функция для форматирования чисел и строк?
Я ищу способ разделителя тысяч для строки или чисел ... (например, String.Format в С #)
javascript
string
numbers
format
LostLord
источник
источник
How to print a number with commas as thousands separators in JavaScript
: stackoverflow.com/questions/2901102/…Ответы:
Обновление (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, '$1' + ',' + '$2'); } return x1 + x2; }
Изменить: чтобы пойти другим путем (преобразовать строку с запятыми в число), вы можете сделать что-то вроде этого:
parseFloat("1,234,567.89".replace(/,/g,''))
источник
(1234567).toLocaleString().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 .
Edit: Commentor @I как Серена добавляет следующее:
источник
Number(yourNumberOrString).toLocaleString()
value.toLocaleString('en')
. Также работает с плавающей точкой.7,77,77,777
, используйтеvalue.toLocaleString('en-IN')
Можно использовать регулярное выражение, что особенно полезно при работе с большими числами, хранящимися в виде строк.
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))
» Verbose regex explanation (regex101.com)
источник
There's a nice jQuery number plugin: https://github.com/teamdf/jquery-number
It allows you to change any number in the format you like, with options for decimal digits and separator characters for decimal and thousand:
$.number(12345.4556, 2); // -> 12,345.46 $.number(12345.4556, 3, ',', ' ') // -> 12 345,456
You can use it inside input fields directly, which is nicer, using same options like above:
$("input").number(true, 2);
Or you can apply to a whole set of DOM elements using selector:
$('span.number').number(true, 2);
источник
I use this:
function numberWithCommas(number) { return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); }
source: link
источник
'123452343267.0505'.replace(/\B(?=(\d{3})+(?!\d))/g, ","); "123,452,343,267.0,505"
- notice that last comma after the decimal point.// 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, '$1,$2'); } 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, '$1,$2'); } document.getElementById(arguments[1]).innerHTML = V; } else return false; }
источник
var number = 35002343; console.log(number.toLocaleString());
for the reference you can check here https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString
источник
You can use javascript. below are the code, it will only
accept
numeric and onedot
<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, '$1' + ',' + '$2'); } ctrl.value = x1 + x2; } function CheckNumeric() { return event.keyCode >= 48 && event.keyCode <= 57 || event.keyCode == 46; } </script>
<input type="text" onkeypress="return CheckNumeric()" onkeyup="FormatCurrency(this)" />
DEMO JSFIDDLE
источник
PHP.js has a function to do this called number_format. If you are familiar with PHP it works exactly the same way.
источник
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>
источник
All you need to do is just really this:
123000.9123.toLocaleString() //result will be "123,000.912"
источник
toLocaleString()
which does not add the commas, or lacks other features in the standard. It's easy to check fortoLocaleString
presence but not to check for its compliance.Combination of solutions for react
let converter = Intl.NumberFormat(); let salary = monthlySalary.replace(/,/g,'') console.log(converter.format(salary)) this.setState({ monthlySalary: converter.format(salary) }) } handleOnChangeMonthlySalary(1000)```
источник
You can use ngx-format-field. It is a directive to format the input value which will appear in the view. It will not manipulate the Input value which will be saved in the backend. See link here!
Example:
component.html: <input type="text" formControlName="currency" [appFormatFields]="CURRENCY" (change)="onChangeCurrency()"> component.ts onChangeCurrency() { this.currency.patchValue(this.currency.value); }
To see the demo: here!
источник
You can use the following function:
function format(number, decimals = 2, decimalSeparator = '.', thousandsSeparator = ',') { const roundedNumber = number.toFixed(decimals); let integerPart = '', fractionalPart = ''; if (decimals == 0) { integerPart = roundedNumber; decimalSeparator = ''; } else { let numberParts = roundedNumber.split('.'); integerPart = numberParts[0]; fractionalPart = numberParts[1]; } integerPart = integerPart.replace(/(\d)(?=(\d{3})+(?!\d))/g, `$1${thousandsSeparator}`); return `${integerPart}${decimalSeparator}${fractionalPart}`; } // Use Example let min = 1556454.0001; let max = 15556982.9999; console.time('number format'); for (let i = 0; i < 15; i++) { let randomNumber = Math.random() * (max - min) + min; let formated = format(randomNumber, 4, ',', '.'); // formated number console.log('number: ', randomNumber, '; formated: ', formated); } console.timeEnd('number format');
источник
I did not like any of the answers here, so I created a function that worked for me. Just want to share in case anyone else finds it useful.
function getFormattedCurrency(num) { num = num.toFixed(2) var cents = (num - Math.floor(num)).toFixed(2); return Math.floor(num).toLocaleString() + '.' + cents.split('.')[1]; }
источник