Javascript Bin Ayırıcı / dize biçimi [yinelenen]


105

Javascript'te sayı ve dizeleri biçimlendirmek için herhangi bir işlev var mı?

Dize veya sayılar için bin ayırıcı için bir yol arıyorum ... (String.Format In c # gibi)



Sanırım ihtiyacın olanı orada bulacaksın :) stackoverflow.com/questions/610406/…
Jad

How to print a number with commas as thousands separators in JavaScript: stackoverflow.com/questions/2901102/…
Adrien Be

Yanıtlar:


183

Güncelleme (7 yıl sonra)

Aşağıdaki orijinal cevapta belirtilen referans yanlıştı. Bunun için yerleşik bir işlev vardır , kaiser'in aşağıda önerdiği tam olarak budur :toLocaleString

Böylece şunları yapabilirsiniz:

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

Aşağıda uygulanan işlev de çalışır, ancak gerekli değildir.

(Ben şanslı olsun ve onu öğrenmek istiyorum belki düşünce oldu , 2010 yılında gerekli geri ama olmaz. Buna göre daha güvenilir referans , toLocaleString ben aracı inanın ECMAScript 3rd Edition [1999], çünkü standart bir parçası olmuştur IE 5.5'e kadar desteklenirdi.)


Orijinal Cevap

Bu referansa göre, bir sayıya virgül eklemek için yerleşik bir işlev yoktur. Ancak bu sayfa, kendiniz nasıl kodlayacağınıza dair bir örnek içerir:

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

Düzenleme: Diğer yöne gitmek için (dizeyi virgülle sayıya çevirmek), şöyle bir şey yapabilirsiniz:

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

1
Gerçekten Gerçekten Takdir Ediyorum // Ama bu dizeyi (virgülle) bir sayıya nasıl dönüştürebilirim?
LostLord

bu işlev 100.000'den büyük sayılar için kesiliyor
DevZer0

1
DevZer0 @ öyle değil hiçbir
Tallboy

saf javascript + tek normal ifade ile çalışır stackoverflow.com/a/44324879/681830
Val

4
(1234567).toLocaleString().replace(/,/g," ",)binler arası boşluklar için kullanın
Fanky

125

İlgiliyse lokalize binlerce ayırıcılar, ayraçları ve ondalık ayırıcılar, aşağıdaki ile gidin:

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

Kullanabileceğiniz birkaç seçenek (ve hatta yedek içeren yerel ayarlar) vardır:

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>

İlgili ayrıntılar MDN bilgi sayfasında .

Düzenleme: Commentor @I like Serena şunları ekler:

Hala İngilizce biçimlendirmesini istediğimiz İngilizce olmayan yerel ayara sahip tarayıcıları desteklemek için value.toLocaleString('en'). Ayrıca kayan nokta için de çalışır.


Bu float numaralarını kapsamaz .. parseInt'i parseFloat olarak değiştirebilirsiniz, ancak yourInt = "100,12" (ondalık ayırıcı olarak virgül) ise bu başarısız olacaktır. Bu, bir değiştirme (",", ".") İle düzeltilebilir .. ancak "1.000,12" ile tekrar başarısız olur. Yani ... Bazen tekerleği yeniden icat etmelisiniz. stackoverflow.com/a/2901298/1028304
neiker

1
Bu daha uygun olur:Number(yourNumberOrString).toLocaleString()
Jonathan

2
Hala İngilizce biçimlendirmesini istediğimiz İngilizce olmayan yerel ayara sahip tarayıcıları desteklemek için value.toLocaleString('en'). Ayrıca kayan nokta için de çalışır.
Klaas van Aarsen

1
@ Serhiog.Lazin Safari'de tam olarak ne çalışmıyor (ve hangi işletim sisteminde ve hangi sürümde)?
kaiser

2
Bilginize, Hindistan sayı biçimi için 7,77,77,777kullanınvalue.toLocaleString('en-IN')
Makesh,

38

ECMAScript2018 değişiklikleri doğrultusunda geriye dönük destek kullanılarak güncellendi.
Geriye dönük uyumluluk için orijinal çözümü görmek üzere aşağı kaydırın.

Düzenli bir ifade kullanılabilir - özellikle dizge olarak saklanan büyük sayılarla uğraşmak için kullanışlıdır.

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

»Ayrıntılı normal ifade açıklaması (regex101.com) akış diyagramı


Bu orijinal cevap gerekli olmayabilir, ancak geriye dönük uyumluluk için kullanılabilir.

Bunu tek bir düzenli ifadeyle (geri arama olmadan) halletmeye çalışmak, şu anki yeteneğim Javascript'te olumsuz bir geriye bakma eksikliğimden beni başarısızlığa uğratıyor ... bir dönemin dizininden sonra eşleşme dizininin göründüğü eşleşmeleri yok sayarak.

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

»Ayrıntılı normal ifade açıklaması (regex101.com)

akış diyagramı


Bu sözdizimi diyagramı regex101.com'da mı oluşturuldu?
Gerold Broser

ondalıklı sayılara ne olur?
Emiliano

"Geçersiz normal ifade: geçersiz grup belirleyici adı" alıyorum. React Native 0.59'da bunu yapıyor, ancak bu gerçekten RegEx'i etkilememeli.
Joshua Pinter

@JoshuaPinter Yazma sırasında henüz tüm platformlarda desteklenmeyen arkaya bakma kullanımı olacak. Sanırım özellikle iOS'tan bahsediyorsunuz - Safari benim için hala başarısız olduğu için. Şimdilik geriye dönük uyumlu sürüme bağlı kalmak en iyisi olabilir. Sadece cevabımı geleceğe hazırlamaya çalışıyordum. caniuse.com/#search=lookbehind
Emissary

1
@Emissary Teşekkürler bahşiş için. Evet, JavaScriptCore'un (JSC) nispeten eski bir sürümünü kullanan React Native 0.59 / Android'de. JSC için bir güncelleme içeren React Native 0.60+ sürümüne güncelledikten sonra tekrar deneyeceğim.
Joshua Pinter

11

Güzel bir jQuery numarası eklentisi var: https://github.com/teamdf/jquery-number

Ondalık basamaklar için seçenekler ve ondalık ve bin için ayırıcı karakterler ile, istediğiniz formattaki herhangi bir sayıyı değiştirmenize olanak tanır:

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

Yukarıdaki gibi aynı seçenekleri kullanarak doğrudan giriş alanlarında kullanabilirsiniz, bu daha hoş:

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

Veya seçiciyi kullanarak tüm DOM öğeleri kümesine uygulayabilirsiniz:

$('span.number').number(true, 2);

best solution imho
Michal

Sanmıyorum, neredeyse 800 satırlık yeni bir dosya gereksinimi eklemek, bir karıncayı el bombasıyla öldürmek gibidir
Emiliano

6

Bunu kullanıyorum:

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

kaynak: bağlantı


'123452343267.0505'.replace(/\B(?=(\d{3})+(?!\d))/g, ","); "123,452,343,267.0,505"- ondalık noktadan sonraki son virgülün olduğuna dikkat edin.
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;
}   



3

JavaScript kullanabilirsiniz. kod aşağıdadır, yalnızca acceptsayısal ve birdot

işte 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, '$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


2

Yapmanız gereken tek şey sadece gerçekten bu :

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

Maalesef bu, platformunuza bağlıdır. Bazılarının toLocaleString()virgül eklemeyen veya standartta diğer özelliklerden yoksun bir vardır. toLocaleStringVarlığını kontrol etmek kolaydır, ancak uygunluğunu kontrol etmek değildir.
hippietrail

1000 ile 9999 arasında bir sayı ile deneyin
Emiliano

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>

6
Operatörün ve diğer insanların bu kodun sorunu nasıl çözdüğünü anlayabilmesi için lütfen bir açıklama da ekleyebilir misiniz? Teşekkürler
Punit Gajjar

1000 ve 9999 arasında bir aday ile deneyin
Emiliano

0

Reaksiyon için çözümlerin kombinasyonu

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

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

handleOnChangeMonthlySalary(1000)```

0

Ngx-format-alanını kullanabilirsiniz. Görünümde görünecek giriş değerini biçimlendirmek için bir direktiftir. Arka uca kaydedilecek Giriş değerini değiştirmeyecektir. Buradaki bağlantıya bakın !

Misal:

component.html:

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

component.ts

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

Demoyu görmek için: burada !


0

Aşağıdaki işlevi kullanabilirsiniz:

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


Bunu bu kadar kafa karıştırıcı yapma. sadece toLocaleString () kullanın. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sajad Saderi

@sajadsaderi Ayrıca toLocaleString () arkadaşımı kullanıyorum, ancak bu işlev bana fazla esneklik sağlamıyor, bu nedenle bölgesel kısaltmalarla uğraşmak zorunda değilim ve bu işlevin tanımı number_format ile aynı olduğundan başka biri kullanabilir () php işlevi.
jin_maxtor

-1

Buradaki cevapların hiçbirini beğenmedim, bu yüzden benim için çalışan bir fonksiyon yarattım. Başkasının yararlı bulması durumunda paylaşmak istiyorum.

function getFormattedCurrency(num) {
    num = num.toFixed(2)
    var cents = (num - Math.floor(num)).toFixed(2);
    return Math.floor(num).toLocaleString() + '.' + cents.split('.')[1];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.