JavaScript'te bir fiyatı biçimlendirmek istiyorum. float
Bir bağımsız değişken olarak alır ve string
böyle bir formatlı döndüren bir işlev istiyorum:
"$ 2,500.00"
Bunu yapmanın en iyi yolu nedir?
JavaScript'te bir fiyatı biçimlendirmek istiyorum. float
Bir bağımsız değişken olarak alır ve string
böyle bir formatlı döndüren bir işlev istiyorum:
"$ 2,500.00"
Bunu yapmanın en iyi yolu nedir?
Yanıtlar:
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.
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, formatMoney
yöntemde aşağıdaki iki satırı yapıştırın :
d = d == undefined ? "," : d,
t = t == undefined ? "." : t,
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>
d
ve t
olmaya .
ve ,
sırasıyla böylece olmadığını onlara her zaman belirtmek için. Ayrıca, return
okumak için ifadenin başlangıcını değiştirmenizi öneririz :, return s + '$' + [rest]
aksi takdirde bir dolar işareti almazsınız.
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 */
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 .
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.NumberFormat
kullanı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 */
(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/
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/
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/
.replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")
.
Number.prototype.toMoney = (decimal=2) -> @toFixed(decimal).replace /(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,"
\.
ile değiştirin $
, yani this.toFixed(0).replace(/(\d)(?=(\d{3})+$)/g, "$1,")
.
$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 .
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()
toLocaleString
Sistem 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.
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:
Math.abs(decimals)
sadece yapılmadığı zaman biraz taşındı NaN
.
decimal_sep
artık boş dize olamaz (ondalık ayırıcı bir tür bir zorunluluktur)
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
(+n || 0)
gerekli değildir çünkü this
bir Number
nesne
parseInt
Sayı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) === 0
sekizli veya ondalık.
0
sekizli olarak kabul edildiğini anladım parseInt
. Ancak bu kodda girdi olarak (veya herhangi bir sekizli biçimlendirilmiş herhangi bir değer) parseInt
almak için IMPOSSIBLE vardır 016
, çünkü iletilen argüman işlev parseInt
tarafından 1. işlenir Math.abs
. Bu nedenle, parseInt
yalnızca sıfır olmadığı veya 0.nn
( nn
ondalık değerler olduğu sürece) sıfır ile başlayan bir sayı almanın bir yolu yoktur . Ancak her iki 0
ve 0.nn
dizeleri tarafından dönüştürülmüş olacağını parseInt
olmak suppsed olarak düz bir ZERO içine.
muhasebe.js sayı, para ve para birimi biçimlendirmesi için küçük bir JavaScript kütüphanesidir.
Miktarı bir sayı ise, demek -123
o zaman,
amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' });
dizeyi üretecektir "-$123.00"
.
İşte tam bir çalışma örneği .
minimumFractionDigits: 0
İş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"
var
açıklamada.
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
i = orig.length - i - 1
. Yine de, dizinin bir daha az geçişi.
reduce
Uyumluluk hakkında değil: Yöntem Ecmascript 1.8'de tanıtıldı ve Internet Explorer 8 ve altında desteklenmiyor.
Mevcut tüm tarayıcılar için çalışır
toLocaleString
Bir 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
Bence ne istiyorsun f.nettotal.value = "$" + showValue.toFixed(2);
Numeral.js - @adamwdraper tarafından kolay sayı biçimlendirmesi için bir js kütüphanesi
numeral(23456.789).format('$0,0.00'); // = "$23,456.79"
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 ...
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! :)
javascript-number-formatter (eski adıyla Google Code )
#,##0.00
Negatif veya negatif gibi standart sayı biçimlendirmesini kabul edin -000.####
.# ##0,00
, #,###.##
, #'###.##
olmayan numaralandırma sembolünün veya herhangi bir tür.#,##,#0.000
veya #,###0.##
hepsi geçerlidir.##,###,##.#
ya 0#,#00#.###0#
da hepsi iyi.format( "0.0000", 3.141592)
.(README'sinden alıntı)
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) : "");
};
+n || 0
biraz garip görünen tek şey (yine de bana).
this
son derece kullanışlı bir değişken adıdır. Bunu n
tanı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.
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'
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());
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)
)
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];
}
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)));">
Bir Orada yerleşik olan function
toFixed içindejavascript
var num = new Number(349);
document.write("$" + num.toFixed(2));
toFixed()
toFixed()
Number
nesnenin bir işlevidir ve var num
a olsaydı üzerinde çalışmaz String
, bu nedenle ek bağlam bana yardımcı oldu.
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 .
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.
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 4567
Japonya veya Çin'de $1,234,567
ABD'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"
Genellikle, aynı şeyi yapmanın birden fazla yolu vardır, ancak Number.prototype.toLocaleString
kullanı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.
İş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 .
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('.');
}
}
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('.');
};
}
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('.');
};
}
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('');
};
}
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));
}
Özel binlerce ayırıcı veya ondalık ayırıcı istiyorsanız, şunu kullanın replace()
:
123456.78.format(2).replace(',', ' ').replace('.', ' ');
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);
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();
Number(value)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
Ö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();
};
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€
formatNumber
Javascript'te yerleşik bir işlev yok