Pemisah Seribu Javascript / format string [duplikat]

100

Apakah ada fungsi dalam Javascript untuk memformat angka dan string?

Saya mencari cara untuk ribuan pemisah untuk string atau angka ... (Seperti String.Format Di c #)

LostLord
sumber
Saya pikir Anda akan menemukan apa yang Anda butuhkan di sana :) stackoverflow.com/questions/610406/…
Jad
How to print a number with commas as thousands separators in JavaScript: stackoverflow.com/questions/2901102/…
Adrien Be

Jawaban:

171

Perbarui (7 tahun kemudian)

Referensi yang dikutip dalam jawaban asli di bawah ini salah. Ada yang dibangun di fungsi untuk ini, yang persis apa kaiser menyarankan bawah:toLocaleString

Jadi Anda bisa melakukan:

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

Fungsi yang diterapkan di bawah ini juga berfungsi, tetapi tidak diperlukan.

(Saya pikir mungkin saya akan beruntung dan mengetahui bahwa hal itu diperlukan pada tahun 2010, tetapi tidak. Menurut referensi yang lebih dapat diandalkan ini , toLocaleString telah menjadi bagian dari standar sejak ECMAScript Edisi ke-3 [1999], yang menurut saya berarti itu akan didukung sejauh IE 5.5.)


Jawaban Asli

Menurut referensi ini, tidak ada fungsi bawaan untuk menambahkan koma ke angka. Tetapi halaman itu menyertakan contoh cara mengkodekannya sendiri:

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;
}

Edit: Untuk sebaliknya (ubah string dengan koma menjadi angka), Anda dapat melakukan sesuatu seperti ini:

parseFloat("1,234,567.89".replace(/,/g,''))
Tim Goodman
sumber
1
Benar-benar Menghargai Itu // Tapi Bagaimana Saya Bisa Mengonversi string itu (dengan koma) menjadi angka?
LostLord
fungsi ini rusak untuk angka yang lebih besar dari 100.000
DevZer0
1
@ Dever0 tidak tidak
Tallboy
bekerja dengan javascript murni + regex tunggal ganti stackoverflow.com/a/44324879/681830
Val
4
digunakan (1234567).toLocaleString().replace(/,/g," ",)untuk spasi antara ribuan
Fanky
123

Jika ingin melokalkan ribuan pemisah, pembatas, dan pemisah desimal, ikuti yang berikut ini:

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

Ada beberapa opsi yang dapat Anda gunakan (dan bahkan lokal dengan fallback):

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>

Rincian di halaman info MDN .

Edit: Komentator @ Saya suka Serena menambahkan yang berikut:

Untuk mendukung browser dengan bahasa non-Inggris yang kami masih menginginkan pemformatan bahasa Inggris, gunakan value.toLocaleString('en'). Juga berfungsi untuk floating point.

kaisar
sumber
Ini tidak mencakup angka float .. Anda dapat mengubah parseInt menjadi parseFloat, tetapi jika yourInt = "100,12" (koma sebagai pemisah desimal) ini akan gagal. Ini bisa diperbaiki dengan mengganti (",", ".") .. tapi akan gagal lagi dengan "1.000,12". Jadi ... Terkadang Anda HARUS menemukan kembali kemudi. stackoverflow.com/a/2901298/1028304
neiker
1
Ini akan lebih tepat:Number(yourNumberOrString).toLocaleString()
Jonathan
2
Untuk mendukung browser dengan bahasa non-Inggris yang kami masih menginginkan pemformatan bahasa Inggris, gunakan value.toLocaleString('en'). Juga berfungsi untuk floating point.
Klaas van Aarsen
1
@ Serhiog.Lazin Apa sebenarnya yang tidak bekerja di Safari (dan di OS apa dan di versi mana)?
kaiser
1
FYI, Untuk format angka India seperti 7,77,77,777, gunakanvalue.toLocaleString('en-IN')
Makesh
37

Diperbarui menggunakan dukungan lihat ke belakang sejalan dengan perubahan ECMAScript2018.
Untuk kompatibilitas mundur, gulir lebih jauh ke bawah untuk melihat solusi asli.

Ekspresi reguler dapat digunakan - terutama berguna dalam menangani angka besar yang disimpan sebagai string.

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))

»Penjelasan ekspresi reguler panjang (regex101.com) diagram alir


Jawaban asli ini mungkin tidak diperlukan tetapi dapat digunakan untuk kompatibilitas ke belakang.

Mencoba menangani ini dengan ekspresi reguler tunggal (tanpa panggilan balik) kemampuan saya saat ini membuat saya gagal karena kurangnya tampilan negatif di Javascript ... tidak pernah kurang, inilah alternatif ringkas lain yang berfungsi dalam kebanyakan kasus umum - memperhitungkan titik desimal apa pun dengan mengabaikan kecocokan di mana indeks kecocokan muncul setelah indeks suatu periode.

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))

»Penjelasan ekspresi reguler panjang (regex101.com)

diagram alir

Utusan
sumber
Apakah diagram sintaks ini telah dibuat di regex101.com?
Gerold Broser
apa yang terjadi dengan angka dengan desimal?
Emiliano
Saya mendapatkan "Persamaan reguler tidak valid: nama penentu grup tidak valid". Saat React Native 0.59 melakukan ini, tetapi itu seharusnya tidak memengaruhi RegEx.
Joshua Pinter
@JoshuaPinter Ini akan menjadi penggunaan lihat-belakang yang pada saat penulisan belum didukung di semua platform. Saya menduga Anda merujuk secara khusus ke iOS - karena Safari masih gagal untuk saya juga. Mungkin lebih baik untuk tetap menggunakan versi yang kompatibel dengan versi sebelumnya untuk saat ini. Saya hanya mencoba untuk membuktikan jawaban saya di masa depan. caniuse.com/#search=lookbehind
Utusan
1
@Emary Terima kasih atas tipnya. Ya, ini ada di React Native 0.59 / Android, yang menggunakan versi JavaScriptCore (JSC) yang relatif lebih lama. Saya akan mencoba lagi setelah kami memperbarui ke React Native 0.60+, yang mencakup pembaruan ke JSC.
Joshua Pinter
11

Ada plugin nomor jQuery yang bagus: https://github.com/teamdf/jquery-number

Ini memungkinkan Anda untuk mengubah angka apa pun dalam format yang Anda suka, dengan opsi untuk digit desimal dan karakter pemisah untuk desimal dan ribuan:

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

Anda dapat menggunakannya di dalam kolom input secara langsung, yang lebih bagus, menggunakan opsi yang sama seperti di atas:

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

Atau Anda dapat menerapkan ke seluruh rangkaian elemen DOM menggunakan selector:

$('span.number').number(true, 2);
qdev
sumber
solusi terbaik imho
Michal
Saya rasa tidak, menambahkan persyaratan file baru dengan hampir 800 baris, itu seperti membunuh semut dengan granat
Emiliano
6

Saya menggunakan ini:

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

sumber: link

Abhishek Goel
sumber
'123452343267.0505'.replace(/\B(?=(\d{3})+(?!\d))/g, ","); "123,452,343,267.0,505"- perhatikan bahwa koma terakhir setelah koma desimal.
hippietrail
5
// 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;
}   
h. foroutan
sumber
3

Anda bisa menggunakan javascript. di bawah ini adalah kodenya, hanya acceptnumerik dan satudot

berikut adalah javascriptnya

<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>

HTML

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

DEMO JSFIDDLE

Awtszs
sumber
2

PHP.js memiliki fungsi untuk melakukan ini yang disebut number_format . Jika Anda terbiasa dengan PHP, cara kerjanya persis sama .

istvanp
sumber
Tautan pertama mengikuti implementasi JS dari versi PHP. Ini berguna.
o_nix
2
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>
Ricardo
sumber
6
Bisakah Anda menambahkan beberapa deskripsi juga sehingga op dan orang lain dapat memahami bahwa bagaimana kode ini sebenarnya menyelesaikan masalah. Terima kasih
Punit Gajjar
coba dengan nomber antara 1000 dan 9999
Emiliano
1

Yang perlu Anda lakukan hanyalah ini :

123000.9123.toLocaleString()
//result will be "123,000.912"
Ezeewei
sumber
Sayangnya itu tergantung pada platform Anda. Beberapa memiliki toLocaleString()yang tidak menambahkan koma, atau kekurangan fitur lain dalam standar. Mudah untuk memeriksa toLocaleStringkeberadaan tetapi tidak untuk memeriksa kepatuhannya.
hippietrail
coba dengan angka antara 1000 dan 9999
Emiliano
0

Kombinasi larutan untuk bereaksi

  let converter = Intl.NumberFormat();
  let salary =  monthlySalary.replace(/,/g,'')
  console.log(converter.format(salary))

  this.setState({
    monthlySalary: converter.format(salary)
  })
}

handleOnChangeMonthlySalary(1000)```
Chinedu Ofor
sumber
0

Anda dapat menggunakan ngx-format-field. Ini adalah petunjuk untuk memformat nilai input yang akan muncul dalam tampilan. Ini tidak akan memanipulasi nilai Input yang akan disimpan di backend. Lihat link di sini !

Contoh:

component.html:

<input type="text" formControlName="currency" [appFormatFields]="CURRENCY"
(change)="onChangeCurrency()">

component.ts

onChangeCurrency() {
this.currency.patchValue(this.currency.value);
}

Untuk melihat demo: di sini !

moumita kundu
sumber
0

Anda dapat menggunakan fungsi berikut:

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');

jin_maxtor
sumber
Jangan membuatnya jadi membingungkan. cukup gunakan toLocaleString (). Informasi lebih lanjut di developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sajad Saderi
@sajadsaderi Saya juga menggunakan teman toLocaleString (), tetapi fungsi ini tidak memberi saya banyak fleksibilitas, jadi saya tidak perlu berurusan dengan singkatan regional dan orang lain dapat menggunakannya karena definisi fungsi ini identik dengan number_format () fungsi php.
jin_maxtor
-1

Saya tidak suka salah satu jawaban di sini, jadi saya membuat fungsi yang berfungsi untuk saya. Hanya ingin berbagi jika ada orang lain yang menganggapnya berguna.

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