Czy w JavaScript jest jakaś funkcja do formatowania liczb i ciągów?
Szukam sposobu na separator tysięcy dla ciągu lub liczb ... (jak String.Format w C #)
javascript
string
numbers
format
LostLord
źródło
źródło
How to print a number with commas as thousands separators in JavaScript
: stackoverflow.com/questions/2901102/…Odpowiedzi:
Aktualizacja (7 lat później)
Odniesienie cytowane w oryginalnej odpowiedzi poniżej było błędne. Tam jest wbudowany w funkcji dla tego, co jest dokładnie to, co Kaiser sugeruje poniżej:
toLocaleString
Więc możesz zrobić:
(1234567.89).toLocaleString('en') // for numeric input parseFloat("1234567.89").toLocaleString('en') // for string input
Funkcja zaimplementowana poniżej również działa, ale po prostu nie jest konieczna.
(Pomyślałem, że może będę miał szczęście i okaże się, że było to konieczne w 2010 r., Ale nie. Zgodnie z tym bardziej wiarygodnym odniesieniem toLocaleString jest częścią standardu od 3. wydania ECMAScript [1999], co moim zdaniem oznacza to byłby obsługiwany już w IE 5.5.)
Oryginalna odpowiedź
Zgodnie z tym odniesieniem nie ma wbudowanej funkcji dodawania przecinków do liczby. Ale ta strona zawiera przykład, jak samodzielnie ją zakodować:
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; }
Edycja: Aby przejść w drugą stronę (przekonwertować ciąg z przecinkami na liczbę), możesz zrobić coś takiego:
parseFloat("1,234,567.89".replace(/,/g,''))
źródło
(1234567).toLocaleString().replace(/,/g," ",)
dla przestrzeni między tysiącamiJeśli chodzi o lokalizację separatorów tysięcy, ograniczników i separatorów dziesiętnych, wykonaj następujące czynności:
// --> numObj.toLocaleString( [locales [, options] ] ) parseInt( number ).toLocaleString();
Istnieje kilka opcji, których możesz użyć (a nawet ustawienia regionalne z rezerwami):
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>
Szczegóły na stronie informacyjnej MDN .
Edycja: Komentator @ Lubię Serenę dodaje:
źródło
Number(yourNumberOrString).toLocaleString()
value.toLocaleString('en')
. Działa również dla zmiennoprzecinkowych.7,77,77,777
, zastosowanievalue.toLocaleString('en-IN')
Można użyć wyrażenia regularnego - jest to szczególnie przydatne w przypadku dużych liczb przechowywanych jako łańcuchy.
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))
»Pełne wyjaśnienie wyrażenia regularnego (regex101.com)
Próbując poradzić sobie z tym za pomocą pojedynczego wyrażenia regularnego (bez wywołania zwrotnego), moja obecna umiejętność zawodzi mnie z powodu braku negatywnego spojrzenia wstecz w Javascript ... nie mniej jednak, oto kolejna zwięzła alternatywa, która działa w większości przypadków - uwzględnianie dowolnego przecinka dziesiętnego ignorując dopasowania, w których indeks dopasowania występuje po indeksie kropki.
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))
»Pełne wyjaśnienie wyrażenia regularnego (regex101.com)
źródło
Jest fajna wtyczka numeru jQuery: https://github.com/teamdf/jquery-number
Pozwala na zmianę dowolnej liczby w formacie, który lubisz, z opcjami dla cyfr dziesiętnych i znaków separatora dla dziesiętnych i tysięcy:
$.number(12345.4556, 2); // -> 12,345.46 $.number(12345.4556, 3, ',', ' ') // -> 12 345,456
Możesz go używać bezpośrednio w polach wejściowych, co jest przyjemniejsze, używając tych samych opcji, co powyżej:
$("input").number(true, 2);
Lub możesz zastosować do całego zestawu elementów DOM za pomocą selektora:
$('span.number').number(true, 2);
źródło
Używam tego:
function numberWithCommas(number) { return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); }
źródło: link
źródło
'123452343267.0505'.replace(/\B(?=(\d{3})+(?!\d))/g, ","); "123,452,343,267.0,505"
- zauważ, że ostatni przecinek po przecinku.// 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; }
źródło
var number = 35002343; console.log(number.toLocaleString());
w celach informacyjnych możesz sprawdzić tutaj https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString
źródło
Możesz użyć javascript. poniżej jest kod, będzie on tylko
accept
numeryczny i jedendot
<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
źródło
PHP.js ma do tego funkcję o nazwie number_format . Jeśli znasz PHP, działa dokładnie tak samo .
źródło
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>
źródło
Wszystko, co musisz zrobić, to po prostu naprawdę to :
123000.9123.toLocaleString() //result will be "123,000.912"
źródło
toLocaleString()
który nie dodaje przecinków lub nie ma innych funkcji w standardzie. Łatwo jest sprawdzićtoLocaleString
obecność, ale nie sprawdzić jej zgodności.Połączenie rozwiązań do reagowania
let converter = Intl.NumberFormat(); let salary = monthlySalary.replace(/,/g,'') console.log(converter.format(salary)) this.setState({ monthlySalary: converter.format(salary) }) } handleOnChangeMonthlySalary(1000)```
źródło
Możesz użyć ngx-format-field. Jest to dyrektywa służąca do formatowania wartości wejściowej, która pojawi się w widoku. Nie będzie manipulować wartością wejściową, która zostanie zapisana w zapleczu. Zobacz link tutaj !
Przykład:
component.html: <input type="text" formControlName="currency" [appFormatFields]="CURRENCY" (change)="onChangeCurrency()"> component.ts onChangeCurrency() { this.currency.patchValue(this.currency.value); }
Aby zobaczyć demo: tutaj !
źródło
Możesz użyć następującej funkcji:
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');
źródło
Nie podobała mi się żadna z odpowiedzi tutaj, więc stworzyłem funkcję, która działała dla mnie. Chcę tylko udostępnić na wypadek, gdyby ktoś inny uznał to za przydatne.
function getFormattedCurrency(num) { num = num.toFixed(2) var cents = (num - Math.floor(num)).toFixed(2); return Math.floor(num).toLocaleString() + '.' + cents.split('.')[1]; }
źródło