Saya ingin memformat harga dalam JavaScript. Saya ingin fungsi yang mengambil float
sebagai argumen dan mengembalikan yang string
diformat seperti ini:
"$ 2,500.00"
Apa cara terbaik untuk melakukan ini?
Saya ingin memformat harga dalam JavaScript. Saya ingin fungsi yang mengambil float
sebagai argumen dan mengembalikan yang string
diformat seperti ini:
"$ 2,500.00"
Apa cara terbaik untuk melakukan ini?
Jawaban:
Solusi ini kompatibel dengan setiap browser utama:
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)
Yang Anda butuhkan adalah menambahkan simbol mata uang (mis. "$" + profits.toFixed(2)
) Dan Anda akan mendapatkan jumlah Anda dalam dolar.
Jika Anda memerlukan penggunaan ,
antara setiap digit, Anda dapat menggunakan fungsi ini:
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>
Gunakan seperti ini:
(123456789.12345).formatMoney(2, ".", ",");
Jika Anda akan selalu menggunakan '.' dan ',', Anda dapat membiarkan mereka keluar dari panggilan metode Anda, dan metode ini akan menetapkan default untuk Anda.
(123456789.12345).formatMoney(2);
Jika budaya Anda memiliki dua simbol dibalik (yaitu orang Eropa) dan Anda ingin menggunakan default, cukup tempelkan dua baris berikut dalam formatMoney
metode:
d = d == undefined ? "," : d,
t = t == undefined ? "." : t,
Jika Anda dapat menggunakan sintaks ECMAScript modern (yaitu melalui Babel), Anda dapat menggunakan fungsi yang lebih sederhana ini sebagai gantinya:
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
dan t
menjadi .
dan ,
masing - masing sehingga Anda tidak harus menentukannya setiap waktu. juga, saya sarankan untuk memodifikasi awal return
pernyataan untuk membaca return s + '$' + [rest]
:, jika tidak, Anda tidak akan mendapatkan tanda dolar.
Javascript memiliki pemformat angka (bagian dari API Internasionalisasi).
// Create our number formatter.
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
formatter.format(2500); /* $2,500.00 */
Gunakan undefined
menggantikan argumen pertama ( 'en-US'
dalam contoh) untuk menggunakan lokal sistem (pengguna lokal jika kode berjalan di browser). Penjelasan lebih lanjut tentang kode lokal .
Berikut daftar kode mata uang .
Catatan akhir membandingkan ini dengan yang lebih tua. toLocaleString
. Keduanya pada dasarnya menawarkan fungsionalitas yang sama. Namun, toLocaleString dalam inkarnasinya yang lebih lama (pre-Intl) sebenarnya tidak mendukung lokal : ia menggunakan sistem lokal. Karena itu, pastikan Anda menggunakan versi yang benar ( MDN menyarankan untuk memeriksa keberadaanIntl
). Juga, kinerja keduanya sama untuk satu item, tetapi jika Anda memiliki banyak angka untuk diformat, menggunakan Intl.NumberFormat
~ 70 kali lebih cepat. Berikut cara menggunakannya toLocaleString
:
(2500).toLocaleString('en-US', {
style: 'currency',
currency: 'USD',
}); /* $2,500.00 */
(12345.67).toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,'); // 12,345.67
Gagasan di balik solusi ini adalah mengganti bagian yang cocok dengan pertandingan pertama dan koma, yaitu '$&,'
. Pencocokan dilakukan menggunakan pendekatan lookahead . Anda dapat membaca ungkapan sebagai "cocok dengan angka jika diikuti oleh urutan tiga set angka (satu atau lebih) dan satu titik" .
UJI:
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/
Anda juga dapat memperluas prototipe Number
objek untuk menambahkan dukungan tambahan dari sejumlah desimal [0 .. n]
dan ukuran grup angka [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 / UJI: http://jsfiddle.net/hAfMM/435/
Dalam versi super luas ini Anda dapat mengatur berbagai jenis pembatas:
/**
* 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 / UJI: 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,"
\.
dengan $
(end of line), yaitu this.toFixed(0).replace(/(\d)(?=(\d{3})+$)/g, "$1,")
.
$1,
. Pencocokan dilakukan menggunakan pendekatan lookahead . Anda dapat membaca ungkapan sebagai "cocok dengan angka jika diikuti oleh urutan tiga set angka (satu atau lebih) dan satu titik" .
Lihatlah objek Nomor JavaScript dan lihat apakah itu dapat membantu Anda.
toLocaleString()
akan memformat angka menggunakan pemisah ribuan lokasi spesifik. toFixed()
akan membulatkan angka ke sejumlah tempat desimal tertentu.Untuk menggunakan ini pada saat yang sama, nilai harus memiliki jenisnya diubah kembali ke angka karena keduanya menghasilkan string.
Contoh:
Number((someNumber).toFixed(1)).toLocaleString()
toLocaleString
yang menggunakan sistem lokal, dan yang baru (tidak kompatibel) yang berasal dari ECMAScript Intl API. Dijelaskan di sini . Jawaban ini sepertinya ditujukan untuk versi lama.
Di bawah ini adalah kode Patrick Desjardins (alias Daok) dengan sedikit komentar ditambahkan dan beberapa perubahan kecil:
/*
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) : '');
}
dan di sini beberapa tes:
//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));
Perubahan kecil adalah:
sedikit bergerak Math.abs(decimals)
harus dilakukan hanya ketika tidak NaN
.
decimal_sep
tidak boleh berupa string kosong lagi (semacam pemisah desimal adalah HARUS)
kami menggunakan typeof thousands_sep === 'undefined'
seperti yang disarankan dalam Cara terbaik untuk menentukan apakah argumen tidak dikirim ke fungsi JavaScript
(+n || 0)
tidak diperlukan karena this
merupakan Number
objek
parseInt
disebut pada nilai absolut dari bagian INTEGER dari nomor tersebut. Bagian INTEGER tidak dapat memulai dengan NOL kecuali hanya NOL! Dan parseInt(0) === 0
apakah oktal atau desimal.
0
dianggap oktal oleh parseInt
. Tetapi dalam kode ini TIDAK MUNGKIN untuk parseInt
menerima 016
sebagai input (atau nilai format oktal lainnya), karena argumen yang diteruskan ke parseInt
pertama diproses oleh Math.abs
fungsi. Jadi tidak ada cara untuk parseInt
menerima angka yang dimulai dengan nol kecuali hanya nol atau 0.nn
(di mana nn
desimal). Tetapi keduanya 0
dan 0.nn
string akan dikonversi oleh parseInt
menjadi NOL polos seperti yang seharusnya.
accounting.js adalah pustaka JavaScript kecil untuk pemformatan angka, uang, dan mata uang.
Jika jumlah adalah angka, katakan -123
, lalu
amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' });
akan menghasilkan string "-$123.00"
.
Inilah contoh kerja yang lengkap .
minimumFractionDigits: 0
Inilah formatter uang js terbaik yang pernah saya lihat:
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) : "");
};
Itu diformat ulang dan dipinjam dari sini: https://stackoverflow.com/a/149099/751484
Anda harus menyediakan penunjuk mata uang Anda sendiri (Anda menggunakan $ di atas).
Sebut saja seperti ini (walaupun perhatikan bahwa args default ke 2, koma, & titik, jadi Anda tidak perlu memberikan args jika itu pilihan Anda):
var myMoney=3543.75873;
var formattedMoney = '$' + myMoney.formatMoney(2,',','.'); // "$3,543.76"
var
pernyataan.
Sudah ada beberapa jawaban bagus di sini. Inilah upaya lain, hanya untuk bersenang-senang:
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];
}
Dan beberapa tes:
formatDollar(45664544.23423) // "$45,664,544.23"
formatDollar(45) // "$45.00"
formatDollar(123) // "$123.00"
formatDollar(7824) // "$7,824.00"
formatDollar(1) // "$1.00"
Diedit: sekarang ia akan menangani angka negatif juga
i = orig.length - i - 1
di callback. Tetap saja, satu lagi traversal yang kurang dari array.
reduce
Metode ini diperkenalkan di Ecmascript 1.8, dan tidak didukung di Internet Explorer 8 dan di bawah.
Bekerja untuk semua browser saat ini
Gunakan toLocaleString
untuk memformat mata uang dalam representasi bahasa yang sensitif (menggunakan kode mata uang ISO 4217 ).
(2500).toLocaleString("en-GB", {style: "currency", currency: "GBP", minimumFractionDigits: 2})
Contoh cuplikan kode Rand Afrika Selatan untuk @avenmore
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
Saya pikir apa yang Anda inginkan f.nettotal.value = "$" + showValue.toFixed(2);
Numeral.js - perpustakaan js untuk pemformatan angka mudah oleh @adamwdraper
numeral(23456.789).format('$0,0.00'); // = "$23,456.79"
Oke, berdasarkan apa yang Anda katakan, saya menggunakan ini:
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;
Saya terbuka untuk saran peningkatan (saya lebih suka untuk tidak memasukkan YUI hanya untuk melakukan ini :-)) Saya sudah tahu saya harus mendeteksi "." alih-alih hanya menggunakannya sebagai pemisah desimal ...
Saya menggunakan perpustakaan Globalisasi (dari Microsoft):
Ini adalah proyek yang bagus untuk melokalkan angka, mata uang, dan tanggal dan membuatnya secara otomatis diformat dengan cara yang benar sesuai dengan lokal pengguna! ... dan meskipun itu merupakan ekstensi jQuery, saat ini 100% perpustakaan independen. Saya sarankan Anda semua untuk mencobanya! :)
javascript-number-formatter (sebelumnya di Google Code )
#,##0.00
atau dengan negasi -000.####
.# ##0,00
, #,###.##
, #'###.##
atau jenis dari simbol non-penomoran.#,##,#0.000
atau #,###0.##
semuanya valid.##,###,##.#
atau 0#,#00#.###0#
semuanya OK.format( "0.0000", 3.141592)
.(kutipan dari README-nya)
+1 ke Jonathan M untuk memberikan metode asli. Karena ini secara eksplisit formatter mata uang, saya melanjutkan dan menambahkan simbol mata uang (default ke '$') ke output, dan menambahkan koma default sebagai pemisah ribuan. Jika Anda tidak benar-benar menginginkan simbol mata uang (atau ribuan pemisah), cukup gunakan "" (string kosong) sebagai argumen Anda untuk itu.
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
-satunya hal yang tampaknya sedikit aneh (bagi saya).
this
adalah nama variabel yang sangat berguna. Mengubahnya n
sehingga Anda dapat menyimpan 3 karakter pada waktu definisi mungkin diperlukan di era ketika RAM dan bandwidth dihitung dalam KB, tetapi hanya membingungkan di era ketika minifier akan mengurus semua itu sebelum mencapai produksi. Optimalisasi mikro pintar lainnya setidaknya bisa diperdebatkan.
Ada port javascript dari fungsi PHP "number_format".
Saya merasa sangat berguna karena mudah digunakan dan dikenali untuk pengembang PHP.
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;
}
(Blok komentar dari aslinya , termasuk di bawah ini untuk contoh & kredit jatuh tempo)
// 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'
Metode yang lebih pendek (untuk memasukkan ruang, koma atau titik) dengan ekspresi reguler?
Number.prototype.toCurrencyString=function(){
return this.toFixed(2).replace(/(\d)(?=(\d{3})+\b)/g,'$1 ');
}
n=12345678.9;
alert(n.toCurrencyString());
Belum pernah melihat yang seperti ini. Cukup ringkas dan mudah dimengerti.
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)
)
Ini adalah versi dengan lebih banyak opsi dalam hasil akhir untuk memungkinkan memformat mata uang yang berbeda dalam format lokal yang berbeda.
// 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)
)
Jawaban Patrick Desjardins terlihat bagus, tetapi saya lebih suka javascript saya yang sederhana. Inilah fungsi yang baru saja saya tulis untuk memasukkan angka dan mengembalikannya dalam format mata uang (dikurangi tanda dolar)
// 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];
}
Bagian utama adalah memasukkan ribuan pemisah, yang bisa dilakukan seperti ini:
<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)));">
Ada built-in function
toFixed dijavascript
var num = new Number(349);
document.write("$" + num.toFixed(2));
toFixed()
toFixed()
adalah fungsi dari Number
objek dan tidak akan berfungsi var num
jika itu adalah String
, jadi konteks tambahan membantu saya.
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;
}
Dari WillMaster .
Saya menyarankan kelas NumberFormat dari Google Visualisasi API .
Anda dapat melakukan sesuatu seperti ini:
var formatter = new google.visualization.NumberFormat({
prefix: '$',
pattern: '#,###,###.##'
});
formatter.formatValue(1000000); // $ 1,000,000
Saya harap ini membantu.
Ini mungkin agak terlambat, tapi inilah metode yang baru saja saya upayakan bagi rekan kerja untuk menambahkan .toCurrencyString()
fungsi sadar-lokal ke semua angka. Internalisasi hanya untuk pengelompokan angka, BUKAN tanda mata uang - jika Anda menghasilkan dolar, gunakan "$"
sesuai yang disediakan, karena $123 4567
di Jepang atau Cina adalah jumlah USD yang sama seperti $1,234,567
di AS. Jika Anda menghasilkan euro / dll, maka ubah tanda mata uang dari"$"
.
Nyatakan ini di mana saja di KEPALA Anda atau di mana pun diperlukan, tepat sebelum Anda perlu menggunakannya:
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;
}
Lalu kamu selesai! Gunakan di (number).toCurrencyString()
mana saja Anda perlu menampilkan nomor sebagai mata uang.
var MyNumber = 123456789.125;
alert(MyNumber.toCurrencyString()); // alerts "$123,456,789.13"
MyNumber = -123.567;
alert(MyNumber.toCurrencyString()); // alerts "$-123.57"
Seperti biasanya, ada banyak cara untuk melakukan hal yang sama tetapi saya akan menghindari penggunaan Number.prototype.toLocaleString
karena dapat mengembalikan nilai yang berbeda berdasarkan pengaturan pengguna.
Saya juga tidak menyarankan memperpanjang Number.prototype
- memperluas prototipe objek asli adalah praktik yang buruk karena dapat menyebabkan konflik dengan kode orang lain (mis. Perpustakaan / kerangka kerja / plugin) dan mungkin tidak kompatibel dengan implementasi / versi JavaScript di masa mendatang.
Saya percaya bahwa Ekspresi Reguler adalah pendekatan terbaik untuk masalah ini, inilah implementasinya:
/**
* 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);
}
}
diedit pada 2010/08/30: opsi ditambahkan untuk mengatur jumlah angka desimal. diedit pada 2011/08/23: opsi ditambahkan untuk mengatur jumlah angka desimal menjadi nol.
Berikut adalah beberapa solusi, semua lulus dari test suite, test suite dan benchmark termasuk, jika Anda ingin copy dan paste untuk menguji, coba This Gist .
Berbasiskan https://stackoverflow.com/a/14428340/1877620 , tetapi perbaiki jika tidak ada titik desimal.
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));
}
Jika kami ingin kustom pemisah ribuan atau pemisah desimal, gunakan 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,")
Opsi sederhana untuk penempatan koma yang tepat dengan membalik string terlebih dahulu dan regexp dasar.
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();
};
Saya menemukan ini dari: accounting.js . Sangat mudah dan sangat sesuai dengan kebutuhan saya.
// 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