Sayıları para birimi dizesi olarak nasıl biçimlendirebilirim?


1846

JavaScript'te bir fiyatı biçimlendirmek istiyorum. floatBir bağımsız değişken olarak alır ve stringböyle bir formatlı döndüren bir işlev istiyorum:

"$ 2,500.00"

Bunu yapmanın en iyi yolu nedir?


8
formatNumberJavascript'te yerleşik bir işlev yok
zerkms

500
Gelecekte herkes bu okuma, lütfen değil mağaza para birimine şamandıra kullanır. Hassasiyeti ve verileri kaybedeceksiniz. Tam sayı sent (veya kuruş vb.) Olarak saklamalı ve çıktıdan önce dönüştürmelisiniz.
Philip Whitehouse

8
@ user1308743 Float ondalık basamakları saklamaz. Bir değer, taban ve ofset kullanarak sayıları depolar. 0.01 aslında temsil edilemez. Bakınız: en.wikipedia.org/wiki/Floating_point#Accuracy_problems
Philip Whitehouse

6
@ user1308743: Çok büyük bir sayıyı temsil ettiğinizi düşünün (şanslı bir adam olduğunuzu ve bunun banka hesap bakiyeniz olduğunu varsayalım). Hassas bir eksiklik nedeniyle gerçekten para kaybetmek ister misiniz?
ereOn

163
Peki neden kimse aşağıdakileri önermedi? (2500) .toLocaleString ("tr-GB", {stil: "para birimi", para birimi: "GBP", minimumFractionDigits: 2}) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Nick Grealy

Yanıtlar:


1792

Number.prototype.toFixed

Bu çözüm her büyük tarayıcı ile uyumludur:

  const profits = 2489.8237;

  profits.toFixed(3) //returns 2489.824 (rounds up)
  profits.toFixed(2) //returns 2489.82
  profits.toFixed(7) //returns 2489.8237000 (pads the decimals)

Tek ihtiyacınız olan para birimi sembolünü (örn. "$" + profits.toFixed(2)) Eklemektir ve miktarınızı dolar cinsinden alırsınız.

Özel işlev

Eğer kullanılmasını gerektiriyorsa ,her bir basamağı arasına, bu işlevi kullanabilirsiniz:

function formatMoney(number, decPlaces, decSep, thouSep) {
decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces,
decSep = typeof decSep === "undefined" ? "." : decSep;
thouSep = typeof thouSep === "undefined" ? "," : thouSep;
var sign = number < 0 ? "-" : "";
var i = String(parseInt(number = Math.abs(Number(number) || 0).toFixed(decPlaces)));
var j = (j = i.length) > 3 ? j % 3 : 0;

return sign +
	(j ? i.substr(0, j) + thouSep : "") +
	i.substr(j).replace(/(\decSep{3})(?=\decSep)/g, "$1" + thouSep) +
	(decPlaces ? decSep + Math.abs(number - i).toFixed(decPlaces).slice(2) : "");
}

document.getElementById("b").addEventListener("click", event => {
  document.getElementById("x").innerText = "Result was: " + formatMoney(document.getElementById("d").value);
});
<label>Insert your amount: <input id="d" type="text" placeholder="Cash amount" /></label>
<br />
<button id="b">Get Output</button>
<p id="x">(press button to get output)</p>

Şöyle kullanın:

(123456789.12345).formatMoney(2, ".", ",");

Her zaman '.' ve ',', yöntem çağrınızın dışında bırakabilirsiniz ve yöntem bunları sizin için varsayılan olarak kullanacaktır.

(123456789.12345).formatMoney(2);

Kültürünüzde iki sembol (örneğin Avrupalılar) varsa ve varsayılanları kullanmak istiyorsanız, formatMoneyyöntemde aşağıdaki iki satırı yapıştırın :

    d = d == undefined ? "," : d, 
    t = t == undefined ? "." : t, 

Özel işlev (ES6)

Modern ECMAScript sözdizimini (yani Babel aracılığıyla) kullanabiliyorsanız, bunun yerine bu daha basit işlevi kullanabilirsiniz:

function formatMoney(amount, decimalCount = 2, decimal = ".", thousands = ",") {
  try {
    decimalCount = Math.abs(decimalCount);
    decimalCount = isNaN(decimalCount) ? 2 : decimalCount;

    const negativeSign = amount < 0 ? "-" : "";

    let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(decimalCount)).toString();
    let j = (i.length > 3) ? i.length % 3 : 0;

    return negativeSign + (j ? i.substr(0, j) + thousands : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands) + (decimalCount ? decimal + Math.abs(amount - i).toFixed(decimalCount).slice(2) : "");
  } catch (e) {
    console.log(e)
  }
};
document.getElementById("b").addEventListener("click", event => {
  document.getElementById("x").innerText = "Result was: " + formatMoney(document.getElementById("d").value);
});
<label>Insert your amount: <input id="d" type="text" placeholder="Cash amount" /></label>
<br />
<button id="b">Get Output</button>
<p id="x">(press button to get output)</p>


26
her şeyden önce, mükemmel, özlü kod. Amerikalı mısın ancak, size varsayılan değiştirmelidir dve tolmaya .ve ,sırasıyla böylece olmadığını onlara her zaman belirtmek için. Ayrıca, returnokumak için ifadenin başlangıcını değiştirmenizi öneririz :, return s + '$' + [rest]aksi takdirde bir dolar işareti almazsınız.
Jason

744
İnsanların neden bu kodun güzel olduğunu düşündüklerinden emin değilim. Çözülemez. Güzel çalışıyor gibi görünüyor, ama güzel değil.
usr

86
Bu formatMoney işlevi bir yere küçültülmüş bazı JavaScript kodlarından kopyalanmış mı? Orijinali gönderemez misiniz? C, d, i, j, n, s ve t değişkenleri ne anlama geliyor? Bu yazı upvotes ve yorumların miktarına bakılırsa, bu kodun her yerde üretim web sitelerine yapıştırıldığını varsayabiliriz ... Bir gün bir hata varsa kodu korumak iyi şanslar!
zuallauz

259
"şiir"? Daha çok belirsizliğe benziyor. Bu kod golf değil; biraz beyaz boşluk kullanın. Uygun var isimleri de zarar görmezdi.
keithjgrant


1512

Intl.numberformat

Javascript'in bir sayı biçimlendiricisi vardır (Uluslararasılaştırma API'sının bir parçası).

// Create our number formatter.
var formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
});

formatter.format(2500); /* $2,500.00 */

JS keman

Kullanım undefined(ilk argüman yerine 'en-US'örnekte) Sistem yerel (kod bir tarayıcıda çalışan durumda kullanıcı yerel ayarı) kullanmak için. Yerel ayar kodunun ayrıntılı açıklaması .

İşte bu para birimi kodlarının listesi .

Intl.NumberFormat ve Number.prototype.toLocaleString karşılaştırması

Bunu eskisiyle karşılaştıran bir son not. toLocaleString. Her ikisi de aslında aynı işlevselliği sunar. Ancak, toLocaleString eski enkarnasyonlarında (Intl öncesi) yerel ayarları desteklemez : sistem yerel ayarını kullanır. Bu nedenle, doğru sürümü kullandığınızdan emin olun ( MDN varlığını kontrolIntl etmenizi önerir ). Ayrıca, her ikisinin performansı tek bir öğe için aynıdır , ancak biçimlendirilecek çok sayıda numaranız varsa, Intl.NumberFormatkullanımı ~ 70 kat daha hızlıdır. Nasıl kullanılacağı aşağıda açıklanmıştır toLocaleString:

(2500).toLocaleString('en-US', {
  style: 'currency',
  currency: 'USD',
}); /* $2,500.00 */

Tarayıcı desteğiyle ilgili bazı notlar

  • Tarayıcı desteği, günümüzde dünya genelinde% 97,5, ABD'de% 98 ve AB'de% 99 desteğiyle artık sorun değil
  • Gerçekten ihtiyacınız olduğunda fosilleşmiş tarayıcılarda (IE8 gibi) destekleyecek bir şim var .
  • Daha fazla bilgi için CanIUse'a göz atın

89
Bu idomatik JavaScript, basit ve zarif bir çözüm tam da aradığım şeydi.
Guilhem Soulas

9
Bu oylama, çünkü doğal olarak çalışan aptalca basit bir cevap.
Trasiva

17
Tarayıcıların oldukça yüksek bir yüzdesinin bunu desteklediğinden eminim. Bu daha çok değerlendirilmelidir.
flq

2
Bu harika bir cevap ve ben dinamik bir para birimi değeri ile çalışma var, bu yüzden kullanım Avrupa'da ise EUR olarak değişir ve euro işareti gösterir. Bir tedavi çalışır!
17'de

3
2018 ve bu her yerde destekleniyor. Bu doğru cevap olmalı.
sarink

1340

Kısa ve hızlı çözüm (her yerde çalışır!)

(12345.67).toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');  // 12,345.67

Bu çözümün arkasındaki fikir, eşleşen bölümleri ilk eşleme ve virgülle değiştirmektir '$&,'. Eşleme ileriye bakış yaklaşımı kullanılarak yapılır . İfadeyi, "bunu üç sayı kümesi (bir veya daha fazla) ve bir nokta dizisi izliyorsa bir sayıyla eşleştir" olarak okuyabilirsiniz .

TESTLERİ:

1        --> "1.00"
12       --> "12.00"
123      --> "123.00"
1234     --> "1,234.00"
12345    --> "12,345.00"
123456   --> "123,456.00"
1234567  --> "1,234,567.00"
12345.67 --> "12,345.67"

DEMO: http://jsfiddle.net/hAfMM/9571/


Genişletilmiş kısa çözüm

Ayrıca Number, herhangi bir ondalık sayı [0 .. n]ve sayı grubu boyutu için ek destek eklemek üzere nesnenin prototipini genişletebilirsiniz [0 .. x]:

/**
 * Number.prototype.format(n, x)
 * 
 * @param integer n: length of decimal
 * @param integer x: length of sections
 */
Number.prototype.format = function(n, x) {
    var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\.' : '$') + ')';
    return this.toFixed(Math.max(0, ~~n)).replace(new RegExp(re, 'g'), '$&,');
};

1234..format();           // "1,234"
12345..format(2);         // "12,345.00"
123456.7.format(3, 2);    // "12,34,56.700"
123456.789.format(2, 4);  // "12,3456.79"

DEMO / TESTLER: http://jsfiddle.net/hAfMM/435/


Süper genişletilmiş kısa çözüm

Bu süper genişletilmiş versiyonda farklı sınırlayıcı türleri ayarlayabilirsiniz:

/**
 * Number.prototype.format(n, x, s, c)
 * 
 * @param integer n: length of decimal
 * @param integer x: length of whole part
 * @param mixed   s: sections delimiter
 * @param mixed   c: decimal delimiter
 */
Number.prototype.format = function(n, x, s, c) {
    var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\D' : '$') + ')',
        num = this.toFixed(Math.max(0, ~~n));

    return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), '$&' + (s || ','));
};

12345678.9.format(2, 3, '.', ',');  // "12.345.678,90"
123456.789.format(4, 4, ' ', ':');  // "12 3456:7890"
12345678.9.format(0, 3, '-');       // "12-345-679"

DEMO / TESTLER: http://jsfiddle.net/hAfMM/612/


21
Aslında bir adım daha gitti: .replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,").
13:13 de kalisjoshua

4
VisioN ve kalisjoshua regexp ile CoffeeScript sürümü ve ondalık basamak belirtme yolu (böylece varsayılan değeri 2 olarak bırakabilir veya ondalık yok için 0 belirtebilirsiniz):Number.prototype.toMoney = (decimal=2) -> @toFixed(decimal).replace /(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,"
Eric Anderson

11
@Abbas Evet, (satır sonu) \.ile değiştirin $, yani this.toFixed(0).replace(/(\d)(?=(\d{3})+$)/g, "$1,").
VisioN

2
@hanumant Normal dilbilgisi burada biraz karmaşıktır, bu yüzden önce düzenli ifadelerle ilgili kılavuzları okumanızı öneririm (örn. MDN'de ). Bunun arkasındaki fikir, eşleşen bölümleri ilk eşleme ve virgülle değiştirmektir $1,. Eşleme ileriye bakış yaklaşımı kullanılarak yapılır . İfadeyi, "bunu üç sayı kümesi (bir veya daha fazla) ve bir nokta dizisi izliyorsa bir sayıyla eşleştir" olarak okuyabilirsiniz .
VisioN

2
@ JuliendePrabère Lütfen bu yaklaşımla çalışmayan uzun bir sayı örneği verin.
VisioN

248

JavaScript Numarası nesnesine bir göz atın ve size yardımcı olup olamayacağını görün.

  • toLocaleString() bir numarayı yere özgü binlerce ayırıcı kullanarak biçimlendirir.
  • toFixed() sayıyı belirli sayıda ondalık basamağa yuvarlar.

Bunları aynı anda kullanmak için, her ikisinin de bir dize çıkardığı için değerin türünün bir sayıya geri değiştirilmesi gerekir.

Misal:

Number((someNumber).toFixed(1)).toLocaleString()

2
Teşekkürler! Bu fikre dayanarak yeterince kısa ve basit bir tane yapmayı başardım! (ve yerelleştirilmiş) Mükemmel.
Daniel Magliola

7
Aslında yapabilirsin. yani dolar için: '$' + (değer + 0.001) .toLocaleString (). dilim (0, -1)
Zaptree

6
Harika olurdu, ancak şu anda çok az tarayıcı desteği var
acorncom

1
@acorncom Neden "küçük tarayıcı desteği" olduğunu söylüyorsunuz? Number nesnesi Javascript 1.1'den bu yana kullanılmaktadır. Lütfen talebinizi yedekleyen bir referans sağlayın.
Doug S

2
toLocaleStringSistem yerel ayarını kullanan eski bir sürümünün ve ECMAScript Intl API'sinden gelen yeni (uyumsuz) sürümünün olmasına dikkat edilmelidir . Burada açıklanmıştır . Bu cevap eski versiyona yönelik gibi görünüyor.
aross

162

Aşağıda, biraz yorum eklenmiş ve bazı küçük değişiklikler içeren Patrick Desjardins (takma ad Daok) kodu verilmiştir:

/* 
decimal_sep: character used as deciaml separtor, it defaults to '.' when omitted
thousands_sep: char used as thousands separator, it defaults to ',' when omitted
*/
Number.prototype.toMoney = function(decimals, decimal_sep, thousands_sep)
{ 
   var n = this,
   c = isNaN(decimals) ? 2 : Math.abs(decimals), //if decimal is zero we must take it, it means user does not want to show any decimal
   d = decimal_sep || '.', //if no decimal separator is passed we use the dot as default decimal separator (we MUST use a decimal separator)

   /*
   according to [/programming/411352/how-best-to-determine-if-an-argument-is-not-sent-to-the-javascript-function]
   the fastest way to check for not defined parameter is to use typeof value === 'undefined' 
   rather than doing value === undefined.
   */   
   t = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, //if you don't want to use a thousands separator you can pass empty string as thousands_sep value

   sign = (n < 0) ? '-' : '',

   //extracting the absolute value of the integer part of the number and converting to string
   i = parseInt(n = Math.abs(n).toFixed(c)) + '', 

   j = ((j = i.length) > 3) ? j % 3 : 0; 
   return sign + (j ? i.substr(0, j) + t : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ''); 
}

ve burada bazı testler:

//some tests (do not forget parenthesis when using negative numbers and number with no decimals)
alert(123456789.67392.toMoney() + '\n' + 123456789.67392.toMoney(3) + '\n' + 123456789.67392.toMoney(0) + '\n' + (123456).toMoney() + '\n' + (123456).toMoney(0) + '\n' + 89.67392.toMoney() + '\n' + (89).toMoney());

//some tests (do not forget parenthesis when using negative numbers and number with no decimals)
alert((-123456789.67392).toMoney() + '\n' + (-123456789.67392).toMoney(-3));

Küçük değişiklikler:

  1. Math.abs(decimals)sadece yapılmadığı zaman biraz taşındı NaN.

  2. decimal_sep artık boş dize olamaz (ondalık ayırıcı bir tür bir zorunluluktur)

  3. JavaScript işlevine bir bağımsız değişken gönderilip gönderilmeyeceğini belirlemek için en iyi nasıl yapılırtypeof thousands_sep === 'undefined' bölümünde önerilen şekilde kullanırız

  4. (+n || 0)gerekli değildir çünkü thisbir Numbernesne

JS Fiddle


8
ParseInt içinde sayı tabanı olarak '10' kullanmak isteyebilirsiniz. Aksi takdirde, '0' ile başlayan herhangi bir sayı sekizlik sayı kullanır.
sohtimsso1970

3
@ sohtimsso1970: geç cevap verdiğim için üzgünüm, ama biraz daha açıklayabilir misin? Bir sayının sekizlik olarak nerede yorumlanabileceğini görmüyorum. parseIntSayının tamsayı kısmının mutlak değerine adlandırılır. INTEGER kısmı, sadece bir SIFIR olmadığı sürece SIFIR ile başlayamaz! Ve parseInt(0) === 0sekizli veya ondalık.
Marco Demaio

Örneğin, şunu deneyin: parseInt ("016") ... 14 değerini döndürür, çünkü parseInt, dize sıfırla başladığında sekizli kodlanmış olduğunu varsayar.
Tracker1

4
@ Tracker1: ile başlayan bir sayının 0sekizli olarak kabul edildiğini anladım parseInt. Ancak bu kodda girdi olarak (veya herhangi bir sekizli biçimlendirilmiş herhangi bir değer) parseIntalmak için IMPOSSIBLE vardır 016, çünkü iletilen argüman işlev parseInttarafından 1. işlenir Math.abs. Bu nedenle, parseIntyalnızca sıfır olmadığı veya 0.nn( nnondalık değerler olduğu sürece) sıfır ile başlayan bir sayı almanın bir yolu yoktur . Ancak her iki 0ve 0.nndizeleri tarafından dönüştürülmüş olacağını parseIntolmak suppsed olarak düz bir ZERO içine.
Marco Demaio

Bu işlev yanlış:> (2030) .toMoney (0, '.', ''); <"2 03 0"
Anton P Robul

124

muhasebe.js sayı, para ve para birimi biçimlendirmesi için küçük bir JavaScript kütüphanesidir.


... sadece bir para birimi simgesi geçmeyi unutmayın aksi takdirde IE7 ve IE8 hataları, IE9 her iki şekilde de iyi
vektör

2
IE7 / IE8 hatası düzeltilmiş gibi görünüyor.
Mat Schaffer

2
Bu harika bir kütüphane, para birimi sembolünü geçebilmek de iyi bir fikir, çünkü tüm para birimi ayrıntıları tek işlev çağrısı / ayarlarında yer alıyor
farinspace

2
Biçimlendirilmiş bir para birimi dizesini tersine çevirmek ve sayısal değeri almak gerçeğini seviyorum.
Neil Monroe

2
muhasebe.js son zamanlarda korunmuyor gibi görünüyor. Son değişikliklerle birlikte bir çatal github.com/nashdot/accounting-js
RationalDev, GoFundMonica'dan

124

Miktarı bir sayı ise, demek -123o zaman,

amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' });

dizeyi üretecektir "-$123.00".

İşte tam bir çalışma örneği .


7
Bu cevap neredeyse benim için vardı, ama en yakın kuruşa yuvarlanmasına ihtiyacım vardı. Miktar.toLocaleString ('en-GB', {style: 'currency', currency: 'GBP', maximumFractionDigits: 2}) kullandığım şey bu;
Nico

Yukarıdaki kod, istediğiniz basamak sayısına yuvarlanır. Örneğe bakın ve giriş kutusuna 1.237 yazın.
Daniel Barbalace

3
Safari'de çalışmıyor gibi görünüyor. Herhangi bir biçimlendirme olmadan sayıyı bir String olarak döndürür.
Lance Anderson

1
Vay canına, bu gerçekten harika bir cevap. Üst olmalı.
Ethan

2
Herhangi bir nedenden dolayı sent istemiyorsanız, ondalık duyarlığı aşağıdakilerle değiştirebilirsiniz:minimumFractionDigits: 0
Horacio

99

İşte gördüğüm en iyi js para biçimlendirici:

Number.prototype.formatMoney = function(decPlaces, thouSeparator, decSeparator) {
    var n = this,
        decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces,
        decSeparator = decSeparator == undefined ? "." : decSeparator,
        thouSeparator = thouSeparator == undefined ? "," : thouSeparator,
        sign = n < 0 ? "-" : "",
        i = parseInt(n = Math.abs(+n || 0).toFixed(decPlaces)) + "",
        j = (j = i.length) > 3 ? j % 3 : 0;
    return sign + (j ? i.substr(0, j) + thouSeparator : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thouSeparator) + (decPlaces ? decSeparator + Math.abs(n - i).toFixed(decPlaces).slice(2) : "");
};

Yeniden biçimlendirildi ve buradan ödünç alındı: https://stackoverflow.com/a/149099/751484

Kendi para birimi belirleyicinizi sağlamanız gerekir (yukarıda $ kullandınız).

Bu şekilde çağırın (argümanların varsayılan olarak 2, virgül ve noktaya ayarlandığını unutmayın, bu nedenle tercihiniz buysa herhangi bir argüman sağlamanız gerekmez):

var myMoney=3543.75873;
var formattedMoney = '$' + myMoney.formatMoney(2,',','.'); // "$3,543.76"


6
@hacklikecrack, tüm değişkenler yereldir; İçinde bulundukları varaçıklamada.
Jonathan M

3
üzgünüm, evet, argümanları yeniden söylüyorsun. Girinti! ;)
hacklikecrack

Değişken isimlerinin korkunç kullanımı!
Serj Sagan

77

Burada zaten bazı harika cevaplar var. İşte sadece eğlence için başka bir girişim:

function formatDollar(num) {
    var p = num.toFixed(2).split(".");
    return "$" + p[0].split("").reverse().reduce(function(acc, num, i, orig) {
        return  num=="-" ? acc : num + (i && !(i % 3) ? "," : "") + acc;
    }, "") + "." + p[1];
}

Ve bazı testler:

formatDollar(45664544.23423) // "$45,664,544.23"
formatDollar(45) // "$45.00"
formatDollar(123) // "$123.00"
formatDollar(7824) // "$7,824.00"
formatDollar(1) // "$1.00"

Düzenlendi: şimdi negatif sayıları da ele alacak


şiir. parlak. tersi () ortadan kaldırması gereken reduceRight () developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… ' ı denediniz mi?
Steve

1
@Steve - Haklısınız, ancak geri aramada olduğu gibi bir şey yapmanız gerekir i = orig.length - i - 1. Yine de, dizinin bir daha az geçişi.
Wayne

11
reduceUyumluluk hakkında değil: Yöntem Ecmascript 1.8'de tanıtıldı ve Internet Explorer 8 ve altında desteklenmiyor.
Blaise

@Blaise'in dediği gibi, bu yöntem IE 8 veya daha düşük sürümlerde çalışmayacaktır.
rsbarro

Evet, elbette doğru. Cevabın kendisinde belirtildiği gibi, bu sadece eğlence için. Ayrıca, negatif sayıları iyi işlemelidir.
Wayne

76

Mevcut tüm tarayıcılar için çalışır

toLocaleStringBir para birimini dile duyarlı sunumunda biçimlendirmek için kullanın ( ISO 4217 para birimi kodlarını kullanarak ).

(2500).toLocaleString("en-GB", {style: "currency", currency: "GBP", minimumFractionDigits: 2}) 

@Avenmore için örnek Güney Afrika Randı kod snippet'leri

console.log((2500).toLocaleString("en-ZA", {style: "currency", currency: "ZAR", minimumFractionDigits: 2}))
// -> R 2 500,00
console.log((2500).toLocaleString("en-GB", {style: "currency", currency: "ZAR", minimumFractionDigits: 2}))
// -> ZAR 2,500.00


1
Çünkü 'yerel ayarlar' ve 'seçenekler' argümanları yalnızca Chrome 24, IE11 ve Opera 15 gibi çok az sayıda tarayıcı tarafından destekleniyor. Firefox, Safari ve diğer eski sürümleri hala desteklemiyor.
VisioN

3
Kabul etti, tüm tarayıcılarda tam olarak desteklenmiyor (henüz), ancak yine de bir çözüm. (Ve muhtemelen en geçerli çözüm, desteklenmeyen tarayıcılarla ileri uyumlu olduğu için ve Javascript
api'nin

1
Bunu beğendim ve Hint rakam gruplamasıyla çalıştığı için mutluyum.
MSC

7
Bu 2017 itibariyle tamamen destekleniyor ve tek doğru cevap olmalı
Evgeny

1
En son ve en büyük :) FF69, Chrome76, vb. "R 2 500,00" burada kullandığımız şey değil, en-GB ile aynı olan "R 2,500.00" olmalıdır.
avenmore

70

Bence ne istiyorsun f.nettotal.value = "$" + showValue.toFixed(2);


@ ezmek bu işe yarıyor ama artık hesaplamaları vergi alanına taşımıyor?
Rocco The Taco

11
Bir $ işareti eklediğinizde, artık bir sayı değil, bir dizedir.
ezmek

Bu seçenek binler arasına virgül koymaz. :-(
Simon East


27

Tamam, söylediklerinize dayanarak bunu kullanıyorum:

var DecimalSeparator = Number("1.2").toLocaleString().substr(1,1);

var AmountWithCommas = Amount.toLocaleString();
var arParts = String(AmountWithCommas).split(DecimalSeparator);
var intPart = arParts[0];
var decPart = (arParts.length > 1 ? arParts[1] : '');
decPart = (decPart + '00').substr(0,2);

return '£ ' + intPart + DecimalSeparator + decPart;

Ben iyileştirme önerileri için açık (ben sadece bunu yapmak için YUI dahil etmemeyi tercih ediyorum :-)) Zaten ben "." ondalık ayırıcı olarak kullanmak yerine ...


8
Sürümünüzün iki ondalık basamağa düzgün şekilde yuvarlanmadığını unutmayın. Örneğin, 3.706 olması gerektiği gibi "£ 3.71" olarak değil "3.70 £" olarak biçimlendirilir.
Ateş Goral

Evet, benim özel durumda 's ok, miktarlar beri çalışıyorum zaten en fazla 2 basamaklı azından ben 2 ondalık için düzeltme gereken nedeniniz ondalık değil ya sadece 1. olan tutarlar içindir
Daniel MAGLIOLA

26

Globalize (Microsoft'tan) kütüphanesini kullanıyorum :

Sayıları, para birimlerini ve tarihleri ​​yerelleştirmek ve bunları kullanıcının yerel ayarlarına göre otomatik olarak doğru şekilde biçimlendirmek için harika bir proje! ... ve jQuery uzantısı olmasına rağmen şu anda% 100 bağımsız bir kütüphane. Hepinize denemenizi öneririm! :)


3
Vay canına, bu neden daha fazla değerlendirilmiyor? Her türlü biçimlendirme için büyük standartlaştırılmış kütüphane. Doğru küreselleşmeye sahip endüstri standardı biçimlendirme parametreleri. Mükemmel cevap!!
pbarranis

Hala alfa aşaması olarak kabul edilir, bu yüzden dikkatli kullanın, ancak büyük bulmak.
Neil Monroe

1
Artık alfa (veya beta) biçiminde değil. Safari'nin yeni standardı karşılamasını ve IE <11'in ölmesini beklerken bu çok yararlı görünüyor.
Guy Schalnat

25

javascript-number-formatter (eski adıyla Google Code )

  • Kısa, hızlı, esnek ancak bağımsız. MIT lisans bilgileri, boş satırlar ve yorumlar dahil sadece 75 satır.
  • #,##0.00Negatif veya negatif gibi standart sayı biçimlendirmesini kabul edin -000.####.
  • Gibi herhangi bir ülke biçimi kabul # ##0,00, #,###.##, #'###.##olmayan numaralandırma sembolünün veya herhangi bir tür.
  • İstediğiniz sayıda basamak gruplamasını kabul edin. #,##,#0.000veya #,###0.##hepsi geçerlidir.
  • Gereksiz / kusursuz geçirmez biçimlendirmeyi kabul edin. ##,###,##.#ya 0#,#00#.###0#da hepsi iyi.
  • Otomatik sayı yuvarlama.
  • Basit arayüzü, böyle sadece tedarik maske ve değeri: format( "0.0000", 3.141592).
  • Maske ile bir önek ve sonek ekle

(README'sinden alıntı)


23

Orijinal yöntemi sağladığı için Jonathan M'ye + 1'leyin. Bu açıkça bir para birimi formatlayıcı olduğundan, çıktıya para birimi simgesini (varsayılan olarak '$') ekledim ve binler ayırıcısı olarak varsayılan bir virgül ekledim. Aslında bir para birimi simgesi (veya binlik basamak ayırıcısı) istemiyorsanız, bunun için argümanınız olarak "" (boş dize) kullanın.

Number.prototype.formatMoney = function(decPlaces, thouSeparator, decSeparator, currencySymbol) {
    // check the args and supply defaults:
    decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces;
    decSeparator = decSeparator == undefined ? "." : decSeparator;
    thouSeparator = thouSeparator == undefined ? "," : thouSeparator;
    currencySymbol = currencySymbol == undefined ? "$" : currencySymbol;

    var n = this,
        sign = n < 0 ? "-" : "",
        i = parseInt(n = Math.abs(+n || 0).toFixed(decPlaces)) + "",
        j = (j = i.length) > 3 ? j % 3 : 0;

    return sign + currencySymbol + (j ? i.substr(0, j) + thouSeparator : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thouSeparator) + (decPlaces ? decSeparator + Math.abs(n - i).toFixed(decPlaces).slice(2) : "");
};

İlk değişken biraz gariptir, çünkü bu değişkenler zaten fonksiyon bildiriminde bildirilmiştir. Bunun dışında teşekkürler!
Zengin Bradshaw

2
Haklısın. Bu, Jonathan M'nin orijinalinden, hepsinin tek bir değişken ifadesi olarak zincirlendiği bir hata. Bunlar basit ödevler olmalı. Tamir ediyorum.
XML

Bu nedenle, bunun muhtemelen erken optimize edildiğini ve okunabilirlik için yeniden düzenlenmesi gerektiğini düşünüyorum. Ama amacım OP'nin kodunu temelden değiştirmek değil, artırmaktı.
XML

Çok kötü değil - +n || 0biraz garip görünen tek şey (yine de bana).
Zengin Bradshaw

2
thisson derece kullanışlı bir değişken adıdır. Bunu ntanımlamak için 3 karakterden tasarruf edebilmek için dönüştürmek , RAM ve bant genişliği KB olarak sayıldığında bir çağda gerekli olabilir, ancak madencinin üretime geçmeden önce tüm bunlarla ilgileneceği bir dönemde sadece gizlidir. Diğer akıllı mikro optimizasyonlar en azından tartışmalıdır.
XML

22

PHP "number_format" işlevinin bir javascript portu vardır.

PHP geliştiricileri için kullanımı kolay ve tanınabilir olduğu için çok yararlı buluyorum.

function number_format (number, decimals, dec_point, thousands_sep) {
    var n = number, prec = decimals;

    var toFixedFix = function (n,prec) {
        var k = Math.pow(10,prec);
        return (Math.round(n*k)/k).toString();
    };

    n = !isFinite(+n) ? 0 : +n;
    prec = !isFinite(+prec) ? 0 : Math.abs(prec);
    var sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep;
    var dec = (typeof dec_point === 'undefined') ? '.' : dec_point;

    var s = (prec > 0) ? toFixedFix(n, prec) : toFixedFix(Math.round(n), prec); 
    //fix for IE parseFloat(0.55).toFixed(0) = 0;

    var abs = toFixedFix(Math.abs(n), prec);
    var _, i;

    if (abs >= 1000) {
        _ = abs.split(/\D/);
        i = _[0].length % 3 || 3;

        _[0] = s.slice(0,i + (n < 0)) +
               _[0].slice(i).replace(/(\d{3})/g, sep+'$1');
        s = _.join(dec);
    } else {
        s = s.replace('.', dec);
    }

    var decPos = s.indexOf(dec);
    if (prec >= 1 && decPos !== -1 && (s.length-decPos-1) < prec) {
        s += new Array(prec-(s.length-decPos-1)).join(0)+'0';
    }
    else if (prec >= 1 && decPos === -1) {
        s += dec+new Array(prec).join(0)+'0';
    }
    return s; 
}

( Aşağıdaki durumlarda örnekler ve kredi için aşağıda yer alan orijinalden yorum bloğu )

// Formats a number with grouped thousands
//
// version: 906.1806
// discuss at: http://phpjs.org/functions/number_format
// +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// +     bugfix by: Michael White (http://getsprink.com)
// +     bugfix by: Benjamin Lupton
// +     bugfix by: Allan Jensen (http://www.winternet.no)
// +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// +     bugfix by: Howard Yeend
// +    revised by: Luke Smith (http://lucassmith.name)
// +     bugfix by: Diogo Resende
// +     bugfix by: Rival
// +     input by: Kheang Hok Chin (http://www.distantia.ca/)
// +     improved by: davook
// +     improved by: Brett Zamir (http://brett-zamir.me)
// +     input by: Jay Klehr
// +     improved by: Brett Zamir (http://brett-zamir.me)
// +     input by: Amir Habibi (http://www.residence-mixte.com/)
// +     bugfix by: Brett Zamir (http://brett-zamir.me)
// *     example 1: number_format(1234.56);
// *     returns 1: '1,235'
// *     example 2: number_format(1234.56, 2, ',', ' ');
// *     returns 2: '1 234,56'
// *     example 3: number_format(1234.5678, 2, '.', '');
// *     returns 3: '1234.57'
// *     example 4: number_format(67, 2, ',', '.');
// *     returns 4: '67,00'
// *     example 5: number_format(1000);
// *     returns 5: '1,000'
// *     example 6: number_format(67.311, 2);
// *     returns 6: '67.31'
// *     example 7: number_format(1000.55, 1);
// *     returns 7: '1,000.6'
// *     example 8: number_format(67000, 5, ',', '.');
// *     returns 8: '67.000,00000'
// *     example 9: number_format(0.9, 0);
// *     returns 9: '1'
// *     example 10: number_format('1.20', 2);
// *     returns 10: '1.20'
// *     example 11: number_format('1.20', 4);
// *     returns 11: '1.2000'
// *     example 12: number_format('1.2000', 3);
// *     returns 12: '1.200'

Bu sadece bir doğru işlevdir:> number_format (2030, 0, '.', '') <'2030' Harika! Teşekkürler
Anton P Robul

21

Normal ifadeyle daha kısa bir yöntem (boşluk, virgül veya nokta eklemek için)?

    Number.prototype.toCurrencyString=function(){
        return this.toFixed(2).replace(/(\d)(?=(\d{3})+\b)/g,'$1 ');
    }

    n=12345678.9;
    alert(n.toCurrencyString());

20

Böyle bir şey görmedim. Oldukça özlü ve anlaşılması kolay.

function moneyFormat(price, sign = '$') {
  const pieces = parseFloat(price).toFixed(2).split('')
  let ii = pieces.length - 3
  while ((ii-=3) > 0) {
    pieces.splice(ii, 0, ',')
  }
  return sign + pieces.join('')
}

console.log(
  moneyFormat(100),
  moneyFormat(1000),
  moneyFormat(10000.00),
  moneyFormat(1000000000000000000)
)

Burada, farklı yerellik biçimlerindeki farklı para birimlerini biçimlendirmeye izin vermek için son çıktıda daha fazla seçeneğe sahip bir sürüm var.

// higher order function that takes options then a price and will return the formatted price
const makeMoneyFormatter = ({
  sign = '$',
  delimiter = ',',
  decimal = '.',
  append = false,
  precision = 2,
  round = true,
  custom
} = {}) => value => {
  
  const e = [1, 10, 100, 1000, 10000, 100000, 1000000, 10000000]
  
  value = round
    ? (Math.round(value * e[precision]) / e[precision])
    : parseFloat(value)
  
  const pieces = value
    .toFixed(precision)
    .replace('.', decimal)
    .split('')
  
  let ii = pieces.length - (precision ? precision + 1 : 0)
  
  while ((ii-=3) > 0) {
    pieces.splice(ii, 0, delimiter)
  }
  
  if (typeof custom === 'function') {
    return custom({
      sign,
      float: value, 
      value: pieces.join('') 
    })
  }
  
  return append
    ? pieces.join('') + sign
    : sign + pieces.join('')
}

// create currency converters with the correct formatting options
const formatDollar = makeMoneyFormatter()
const formatPound = makeMoneyFormatter({ 
  sign: '£',
  precision: 0
})
const formatEuro = makeMoneyFormatter({
  sign: '€',
  delimiter: '.',
  decimal: ',',
  append: true
})

const customFormat = makeMoneyFormatter({
  round: false,
  custom: ({ value, float, sign }) => `SALE:$${value}USD`
})

console.log(
  formatPound(1000),
  formatDollar(10000.0066),
  formatEuro(100000.001),
  customFormat(999999.555)
)


Harika kod pasajı, teşekkür ederim. Ancak, varsayılan parametreler desteklenmediğinden IE üzerinde çalışmadığından ve <IE11'de "const" ve "let" desteklenmediğinden dikkatli olun. Ue bunu düzeltmek için: + moneyFormat: function (price, sign) {+ if (! Sign) sign = '$'; + adet = parseFloat (fiyat) .toFixed (2) .split ('') + var ii = adet.uzunluk - 3
Charlie Dalsass

Endişelenme @CharlieDalsass. Üretim kodu için ES5'e derlemek için babil kullanmanızı tavsiye ederim.
synthet1c

Peki Euro para birimi nasıl yapılır? 1.000,00 Euro?

@YumYumYum Daha fazla esneklik sağlamak için daha fazla biçimlendirme seçeneğiyle tam bir örnek ekledim.
synthet1c

18

Patrick Desjardins'in cevabı iyi görünüyor, ancak javascriptimi basit tercih ediyorum. İşte bir sayı alıp para birimi biçiminde (dolar işareti eksi) döndürmek için yazdığım bir işlev

// Format numbers to two decimals with commas
function formatDollar(num) {
    var p = num.toFixed(2).split(".");
    var chars = p[0].split("").reverse();
    var newstr = '';
    var count = 0;
    for (x in chars) {
        count++;
        if(count%3 == 1 && count != 1) {
            newstr = chars[x] + ',' + newstr;
        } else {
            newstr = chars[x] + newstr;
        }
    }
    return newstr + "." + p[1];
}

Hem tarayıcıda hem de Düğümün eski bir sürümünde çalışacak bir şeye ihtiyacım vardı. Bu mükemmel çalıştı. Teşekkürler
n8jadams

17

Ana kısım, böyle yapılabilecek bin ayırıcıyı yerleştirmektir:

<script type="text/javascript">
function ins1000Sep(val){
  val = val.split(".");
  val[0] = val[0].split("").reverse().join("");
  val[0] = val[0].replace(/(\d{3})/g,"$1,");
  val[0] = val[0].split("").reverse().join("");
  val[0] = val[0].indexOf(",")==0?val[0].substring(1):val[0];
  return val.join(".");
}
function rem1000Sep(val){
  return val.replace(/,/g,"");
}
function formatNum(val){
  val = Math.round(val*100)/100;
  val = (""+val).indexOf(".")>-1 ? val + "00" : val + ".00";
  var dec = val.indexOf(".");
  return dec == val.length-3 || dec == 0 ? val : val.substring(0,dec+3);
}
</script>

<button onclick="alert(ins1000Sep(formatNum(12313231)));">

İns1000Sep () öğesine negatif değerler girerken yanlış sayı çıktısı alıyorum.
Peter

16

Bir Orada yerleşik olan function toFixed içindejavascript

var num = new Number(349);
document.write("$" + num.toFixed(2));

Bu cevap gereksiz görünüyor. Crush'ın cevabı çoktan sorgulandıtoFixed()
Ian Dunn

3
toFixed()Numbernesnenin bir işlevidir ve var numa olsaydı üzerinde çalışmaz String, bu nedenle ek bağlam bana yardımcı oldu.
timborden

15
function CurrencyFormatted(amount)
{
    var i = parseFloat(amount);
    if(isNaN(i)) { i = 0.00; }
    var minus = '';
    if(i < 0) { minus = '-'; }
    i = Math.abs(i);
    i = parseInt((i + .005) * 100);
    i = i / 100;
    s = new String(i);
    if(s.indexOf('.') < 0) { s += '.00'; }
    if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
    s = minus + s;
    return s;
}

Gönderen WillMaster .


Küçük ve basit. Teşekkür ederim.
Connor Simpson

1
basit, ama 1.000 için virgül yok
aron

15

Google Görselleştirme API'sından NumberFormat sınıfını öneririm .

Bunun gibi bir şey yapabilirsiniz:

var formatter = new google.visualization.NumberFormat({
    prefix: '$',
    pattern: '#,###,###.##'
});

formatter.formatValue(1000000); // $ 1,000,000

Umut ediyorum bu yardım eder.


14

Bu biraz geç olabilir, ama işte bir iş arkadaşının .toCurrencyString()tüm sayılara yerele duyarlı bir işlev eklemesi için çalıştığım bir yöntem . İçselleştirme, para birimi işareti DEĞİLDİR, yalnızca sayı gruplaması içindir - dolar çıktısı alıyorsanız, "$"verilen şekilde kullanın , çünkü $123 4567Japonya veya Çin'de $1,234,567ABD'deki ABD ile aynı sayıdadır. Euro / etc çıktısı alıyorsanız, para birimi işaretini değiştirin "$".

Bunu kullanmanız gerekmeden hemen önce HEAD'inizde herhangi bir yerde veya gerektiğinde beyan edin:

  Number.prototype.toCurrencyString = function(prefix, suffix) {
    if (typeof prefix === 'undefined') { prefix = '$'; }
    if (typeof suffix === 'undefined') { suffix = ''; }
    var _localeBug = new RegExp((1).toLocaleString().replace(/^1/, '').replace(/\./, '\\.') + "$");
    return prefix + (~~this).toLocaleString().replace(_localeBug, '') + (this % 1).toFixed(2).toLocaleString().replace(/^[+-]?0+/,'') + suffix;
  }

O zaman işiniz bitti! (number).toCurrencyString()Numarayı para birimi olarak çıkarmak için ihtiyacınız olan her yerde kullanın .

var MyNumber = 123456789.125;
alert(MyNumber.toCurrencyString()); // alerts "$123,456,789.13"
MyNumber = -123.567;
alert(MyNumber.toCurrencyString()); // alerts "$-123.57"

12

Genellikle, aynı şeyi yapmanın birden fazla yolu vardır, ancak Number.prototype.toLocaleStringkullanıcı ayarlarına göre farklı değerler döndürebildiğinden kullanmaktan kaçınırım .

Ayrıca Number.prototype- yerel nesnelerin prototiplerini genişletmenin kötü bir uygulamadır çünkü diğer kişi kodlarıyla (örneğin, kütüphaneler / çerçeveler / eklentiler) çakışmalara neden olabilir ve gelecekteki JavaScript uygulamaları / sürümleriyle uyumlu olmayabilir.

Düzenli İfadelerin sorun için en iyi yaklaşım olduğuna inanıyorum, işte benim uygulama:

/**
 * Converts number into currency format
 * @param {number} number   Number that should be converted.
 * @param {string} [decimalSeparator]    Decimal separator, defaults to '.'.
 * @param {string} [thousandsSeparator]    Thousands separator, defaults to ','.
 * @param {int} [nDecimalDigits]    Number of decimal digits, defaults to `2`.
 * @return {string} Formatted string (e.g. numberToCurrency(12345.67) returns '12,345.67')
 */
function numberToCurrency(number, decimalSeparator, thousandsSeparator, nDecimalDigits){
    //default values
    decimalSeparator = decimalSeparator || '.';
    thousandsSeparator = thousandsSeparator || ',';
    nDecimalDigits = nDecimalDigits == null? 2 : nDecimalDigits;

    var fixed = number.toFixed(nDecimalDigits), //limit/add decimal digits
        parts = new RegExp('^(-?\\d{1,3})((?:\\d{3})+)(\\.(\\d{'+ nDecimalDigits +'}))?$').exec( fixed ); //separate begin [$1], middle [$2] and decimal digits [$4]

    if(parts){ //number >= 1000 || number <= -1000
        return parts[1] + parts[2].replace(/\d{3}/g, thousandsSeparator + '$&') + (parts[4] ? decimalSeparator + parts[4] : '');
    }else{
        return fixed.replace('.', decimalSeparator);
    }
}

2010/08/30 tarihinde düzenlendi: ondalık basamak sayısını ayarlamak için seçenek eklendi. 2011/08/23 tarihinde düzenlendi: ondalık basamak sayısını sıfıra ayarlama seçeneği eklendi.


ToLocaleString'in amacı, kullanıcının ayarlarına göre ayarlanmasıdır.
Joseph Lennox

11

İşte bazı çözümler, hepsi test paketini, test paketini ve karşılaştırma testini içeriyor, kopyala ve yapıştır test etmek istiyorsanız, Bu Gist'i deneyin .

Yöntem 0 (RegExp)

Https://stackoverflow.com/a/14428340/1877620 temel alın , ancak ondalık ayırıcı yoksa düzeltin.

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('.');
        a[0] = a[0].replace(/\d(?=(\d{3})+$)/g, '$&,');
        return a.join('.');
    }
}

Yöntem 1

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('.'),
            // skip the '-' sign
            head = Number(this < 0);

        // skip the digits that's before the first thousands separator 
        head += (a[0].length - head) % 3 || 3;

        a[0] = a[0].slice(0, head) + a[0].slice(head).replace(/\d{3}/g, ',$&');
        return a.join('.');
    };
}

Yöntem 2 (Diziye Böl)

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('.');

        a[0] = a[0]
            .split('').reverse().join('')
            .replace(/\d{3}(?=\d)/g, '$&,')
            .split('').reverse().join('');

        return a.join('.');
    };
}

Yöntem 3 (Döngü)

if (typeof Number.prototype.format === 'undefined') {
    Number.prototype.format = function (precision) {
        if (!isFinite(this)) {
            return this.toString();
        }

        var a = this.toFixed(precision).split('');
        a.push('.');

        var i = a.indexOf('.') - 3;
        while (i > 0 && a[i-1] !== '-') {
            a.splice(i, 0, ',');
            i -= 3;
        }

        a.pop();
        return a.join('');
    };
}

Kullanım Örneği

console.log('======== Demo ========')
console.log(
    (1234567).format(0),
    (1234.56).format(2),
    (-1234.56).format(0)
);
var n = 0;
for (var i=1; i<20; i++) {
    n = (n * 10) + (i % 10)/100;
    console.log(n.format(2), (-n).format(2));
}

Ayırıcı

Özel binlerce ayırıcı veya ondalık ayırıcı istiyorsanız, şunu kullanın replace():

123456.78.format(2).replace(',', ' ').replace('.', ' ');

Test odası

function assertEqual(a, b) {
    if (a !== b) {
        throw a + ' !== ' + b;
    }
}

function test(format_function) {
    console.log(format_function);
    assertEqual('NaN', format_function.call(NaN, 0))
    assertEqual('Infinity', format_function.call(Infinity, 0))
    assertEqual('-Infinity', format_function.call(-Infinity, 0))

    assertEqual('0', format_function.call(0, 0))
    assertEqual('0.00', format_function.call(0, 2))
    assertEqual('1', format_function.call(1, 0))
    assertEqual('-1', format_function.call(-1, 0))
    // decimal padding
    assertEqual('1.00', format_function.call(1, 2))
    assertEqual('-1.00', format_function.call(-1, 2))
    // decimal rounding
    assertEqual('0.12', format_function.call(0.123456, 2))
    assertEqual('0.1235', format_function.call(0.123456, 4))
    assertEqual('-0.12', format_function.call(-0.123456, 2))
    assertEqual('-0.1235', format_function.call(-0.123456, 4))
    // thousands separator
    assertEqual('1,234', format_function.call(1234.123456, 0))
    assertEqual('12,345', format_function.call(12345.123456, 0))
    assertEqual('123,456', format_function.call(123456.123456, 0))
    assertEqual('1,234,567', format_function.call(1234567.123456, 0))
    assertEqual('12,345,678', format_function.call(12345678.123456, 0))
    assertEqual('123,456,789', format_function.call(123456789.123456, 0))
    assertEqual('-1,234', format_function.call(-1234.123456, 0))
    assertEqual('-12,345', format_function.call(-12345.123456, 0))
    assertEqual('-123,456', format_function.call(-123456.123456, 0))
    assertEqual('-1,234,567', format_function.call(-1234567.123456, 0))
    assertEqual('-12,345,678', format_function.call(-12345678.123456, 0))
    assertEqual('-123,456,789', format_function.call(-123456789.123456, 0))
    // thousands separator and decimal
    assertEqual('1,234.12', format_function.call(1234.123456, 2))
    assertEqual('12,345.12', format_function.call(12345.123456, 2))
    assertEqual('123,456.12', format_function.call(123456.123456, 2))
    assertEqual('1,234,567.12', format_function.call(1234567.123456, 2))
    assertEqual('12,345,678.12', format_function.call(12345678.123456, 2))
    assertEqual('123,456,789.12', format_function.call(123456789.123456, 2))
    assertEqual('-1,234.12', format_function.call(-1234.123456, 2))
    assertEqual('-12,345.12', format_function.call(-12345.123456, 2))
    assertEqual('-123,456.12', format_function.call(-123456.123456, 2))
    assertEqual('-1,234,567.12', format_function.call(-1234567.123456, 2))
    assertEqual('-12,345,678.12', format_function.call(-12345678.123456, 2))
    assertEqual('-123,456,789.12', format_function.call(-123456789.123456, 2))
}

console.log('======== Testing ========');
test(Number.prototype.format);
test(Number.prototype.format1);
test(Number.prototype.format2);
test(Number.prototype.format3);

Karşılaştırma

function benchmark(f) {
    var start = new Date().getTime();
    f();
    return new Date().getTime() - start;
}

function benchmark_format(f) {
    console.log(f);
    time = benchmark(function () {
        for (var i = 0; i < 100000; i++) {
            f.call(123456789, 0);
            f.call(123456789, 2);
        }
    });
    console.log(time.format(0) + 'ms');
}

// if not using async, browser will stop responding while running.
// this will create a new thread to benchmark
async = [];
function next() {
    setTimeout(function () {
        f = async.shift();
        f && f();
        next();
    }, 10);
}

console.log('======== Benchmark ========');
async.push(function () { benchmark_format(Number.prototype.format); });
next();

Yönteminizden geliştirildi 2. var a = this.toFixed (duyarlık) .split ('.') Yerine var çarpanı = Math.pow (10, duyarlık + 1), wholeNumber = Math.floor (bu * çarpan) ; var a = Math.round (tam Sayı / 10) * 10 / çarpan; if (Dize (a) .indexOf ('.') <1) {a + = '.00'; } a = String (a) .split ('.'), BuFix olduğu için toFixed kullanmayın.
vee

console.log (parseFloat ( '4.835') toFixed (2).); > 4.83 console.log (parseFloat ('54 .835 '). ToFixed (2)); > 54.84 console.log (parseFloat ('454.835'). ToFixed (2)); > 454.83 console.log (parseFloat ('8454.835'). ToFixed (2)); > 8454.83 bu değerin ondalık değeri .84 değil .84 değil
vee


10

Önce dizeyi ve temel regexp'yi ters çevirerek düzgün virgül yerleşimi için basit bir seçenek.

String.prototype.reverse = function() {
    return this.split('').reverse().join('');
};

Number.prototype.toCurrency = function( round_decimal /*boolean*/ ) {       
     // format decimal or round to nearest integer
     var n = this.toFixed( round_decimal ? 0 : 2 );

     // convert to a string, add commas every 3 digits from left to right 
     // by reversing string
     return (n + '').reverse().replace( /(\d{3})(?=\d)/g, '$1,' ).reverse();
};

10

Bunu muhasebe.js'den buldum . Bu çok kolay ve mükemmel benim ihtiyacına uygun.

// Default usage:
accounting.formatMoney(12345678); // $12,345,678.00

// European formatting (custom symbol and separators), can also use options object as second parameter:
accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99

// Negative values can be formatted nicely:
accounting.formatMoney(-500000, "£ ", 0); // £ -500,000

// Simple `format` string allows control of symbol position (%v = value, %s = symbol):
accounting.formatMoney(5318008, { symbol: "GBP",  format: "%v %s" }); // 5,318,008.00 GBP

// Euro currency symbol to the right
accounting.formatMoney(5318008, {symbol: "€", precision: 2, thousand: ".", decimal : ",", format: "%v%s"}); // 1.008,00€ 


$('#price').val( accounting.formatMoney(OOA, { symbol: "€", precision: 2,thousand: ".", decimal :",",format: "%v%s" } ) );- göster 1.000,00 E
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.