Tôi muốn định dạng một mức giá trong JavaScript. Tôi muốn một hàm lấy một float
đối số và trả về một string
định dạng như thế này:
"$ 2,500.00"
Cách tốt nhất để làm điều này là gì?
Tôi muốn định dạng một mức giá trong JavaScript. Tôi muốn một hàm lấy một float
đối số và trả về một string
định dạng như thế này:
"$ 2,500.00"
Cách tốt nhất để làm điều này là gì?
Câu trả lời:
Giải pháp này tương thích với mọi trình duyệt chính duy nhất:
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)
Tất cả những gì bạn cần là thêm ký hiệu tiền tệ (ví dụ "$" + profits.toFixed(2)
) và bạn sẽ có số tiền của mình bằng đô la.
Nếu bạn yêu cầu sử dụng ,
giữa mỗi chữ số, bạn có thể sử dụng chức năng này:
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>
Sử dụng nó như vậy:
(123456789.12345).formatMoney(2, ".", ",");
Nếu bạn luôn sử dụng '.' và ',', bạn có thể loại bỏ chúng khỏi cuộc gọi phương thức của mình và phương thức sẽ mặc định chúng cho bạn.
(123456789.12345).formatMoney(2);
Nếu văn hóa của bạn có hai biểu tượng được lật (tức là người châu Âu) và bạn muốn sử dụng mặc định, chỉ cần dán qua hai dòng sau trong formatMoney
phương thức:
d = d == undefined ? "," : d,
t = t == undefined ? "." : t,
Nếu bạn có thể sử dụng cú pháp ECMAScript hiện đại (tức là thông qua Babel), bạn có thể sử dụng chức năng đơn giản hơn này để thay thế:
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
và t
là .
và ,
tương ứng để bạn không cần phải xác định chúng mọi lúc. Ngoài ra, tôi khuyên bạn nên sửa đổi phần đầu của return
câu lệnh để đọc: return s + '$' + [rest]
nếu không, bạn sẽ không nhận được ký hiệu đô la.
Javascript có một bộ định dạng số (một phần của API quốc tế hóa).
// Create our number formatter.
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
formatter.format(2500); /* $2,500.00 */
Sử dụng undefined
thay cho đối số đầu tiên ('en-US'
trong ví dụ) để sử dụng ngôn ngữ hệ thống (ngôn ngữ người dùng trong trường hợp mã đang chạy trong trình duyệt). Giải thích thêm về mã địa phương .
Đây là một danh sách các mã tiền tệ .
Một lưu ý cuối cùng so sánh điều này với cũ. toLocaleString
. Cả hai đều cung cấp về cơ bản cùng một chức năng. Tuy nhiên, toLocaleString trong các phiên bản cũ hơn (tiền quốc tế) không thực sự hỗ trợ các ngôn ngữ : nó sử dụng ngôn ngữ hệ thống. Do đó, hãy chắc chắn rằng bạn đang sử dụng phiên bản chính xác ( MDN gợi ý để kiểm tra sự tồn tại củaIntl
). Ngoài ra, hiệu suất của cả hai là như nhau cho một đơn hàng, nhưng nếu bạn có rất nhiều con số sang định dạng, sử dụng Intl.NumberFormat
là ~ nhanh hơn 70 lần. Đây là cách sử dụng toLocaleString
:
(2500).toLocaleString('en-US', {
style: 'currency',
currency: 'USD',
}); /* $2,500.00 */
(12345.67).toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,'); // 12,345.67
Ý tưởng đằng sau giải pháp này là thay thế các phần trùng khớp bằng dấu phẩy và dấu phẩy đầu tiên, nghĩa là '$&,'
. Sự phù hợp được thực hiện bằng cách sử dụng phương pháp lookahead . Bạn có thể đọc biểu thức là "khớp một số nếu nó được theo sau bởi một chuỗi gồm ba bộ số (một hoặc nhiều) và một dấu chấm" .
KIỂM TRA:
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/
Bạn cũng có thể mở rộng nguyên mẫu của Number
đối tượng để thêm hỗ trợ cho bất kỳ số thập phân nào [0 .. n]
và kích thước của các nhóm số [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 / KIỂM TRA: http://jsfiddle.net/hAfMM/435/
Trong phiên bản siêu mở rộng này, bạn có thể đặt các loại dấu phân cách khác nhau:
/**
* 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 / KIỂM TRA: 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,"
\.
bằng $
(cuối dòng), nghĩa là this.toFixed(0).replace(/(\d)(?=(\d{3})+$)/g, "$1,")
.
$1,
. Sự phù hợp được thực hiện bằng cách sử dụng phương pháp lookahead . Bạn có thể đọc biểu thức là "khớp một số nếu nó được theo sau bởi một chuỗi gồm ba bộ số (một hoặc nhiều) và một dấu chấm" .
Hãy xem đối tượng Số JavaScript và xem nó có thể giúp bạn không.
toLocaleString()
sẽ định dạng một số bằng cách sử dụng dấu phân cách hàng nghìn vị trí cụ thể. toFixed()
sẽ làm tròn số đến một số thập phân cụ thể.Để sử dụng chúng cùng một lúc, giá trị phải thay đổi kiểu của nó thành một số vì cả hai đều tạo ra một chuỗi.
Thí dụ:
Number((someNumber).toFixed(1)).toLocaleString()
toLocaleString
sử dụng ngôn ngữ hệ thống và phiên bản mới (không tương thích) đến từ API ECMAScript Intl. Giải thích ở đây . Câu trả lời này dường như được dành cho phiên bản cũ.
Dưới đây là mã Patrick Desjardins (bí danh Daok) với một chút bình luận được thêm vào và một số thay đổi nhỏ:
/*
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) : '');
}
và ở đây một số bài kiểm tra:
//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));
Những thay đổi nhỏ là:
di chuyển một chút Math.abs(decimals)
để được thực hiện chỉ khi không NaN
.
decimal_sep
không thể là chuỗi rỗng nữa (một loại dấu tách thập phân nào đó là PHẢI)
chúng tôi sử dụng typeof thousands_sep === 'undefined'
như được đề xuất trong Cách tốt nhất để xác định xem một đối số không được gửi đến hàm JavaScript
(+n || 0)
không cần thiết vì this
là một Number
đối tượng
parseInt
được gọi vào giá trị tuyệt đối của phần INTEGER của số. Phần INTEGER không thể bắt đầu với ZERO trừ khi nó chỉ là ZERO! Và parseInt(0) === 0
bát phân hoặc thập phân.
0
được coi là bát phân bởi parseInt
. Nhưng trong mã này là TÁC ĐỘNG parseInt
để nhận 016
làm đầu vào (hoặc bất kỳ giá trị định dạng bát phân nào khác), bởi vì đối số được truyền đến parseInt
là lần đầu tiên được xử lý bởi Math.abs
hàm. Vì vậy, không có cách nào parseInt
để nhận được một số bắt đầu bằng 0 trừ khi đó chỉ là số 0 hoặc 0.nn
( nn
số thập phân). Nhưng cả hai 0
và 0.nn
chuỗi sẽ được chuyển đổi parseInt
thành một số KHÔNG đơn giản như được cung cấp.
hạch toán.js là một thư viện JavaScript nhỏ để định dạng số, tiền và tiền tệ.
Nếu số tiền là một con số, hãy nói -123
, sau đó
amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' });
sẽ tạo ra chuỗi "-$123.00"
.
Đây là một ví dụ hoạt động hoàn chỉnh .
minimumFractionDigits: 0
Đây là công cụ định dạng tiền js tốt nhất tôi từng thấy:
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) : "");
};
Nó đã được định dạng lại và mượn từ đây: https://stackoverflow.com/a/149099/751484
Bạn sẽ phải cung cấp công cụ chỉ định tiền tệ của riêng bạn (bạn đã sử dụng $ ở trên).
Gọi nó như thế này (mặc dù lưu ý rằng args mặc định là 2, dấu phẩy và dấu chấm, vì vậy bạn không cần cung cấp bất kỳ đối số nào nếu đó là tùy chọn của bạn):
var myMoney=3543.75873;
var formattedMoney = '$' + myMoney.formatMoney(2,',','.'); // "$3,543.76"
var
tuyên bố.
Đã có một số câu trả lời tuyệt vời ở đây. Đây là một nỗ lực khác, chỉ để cho vui:
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];
}
Và một số bài kiểm tra:
formatDollar(45664544.23423) // "$45,664,544.23"
formatDollar(45) // "$45.00"
formatDollar(123) // "$123.00"
formatDollar(7824) // "$7,824.00"
formatDollar(1) // "$1.00"
Đã chỉnh sửa: bây giờ nó cũng sẽ xử lý các số âm
i = orig.length - i - 1
trong cuộc gọi lại. Tuy nhiên, một ít đi qua các mảng.
reduce
Phương pháp được giới thiệu trong Ecmascript 1.8 và không được hỗ trợ trong Internet Explorer 8 trở xuống.
Hoạt động cho tất cả các trình duyệt hiện tại
Sử dụng toLocaleString
để định dạng một loại tiền tệ trong biểu diễn nhạy cảm với ngôn ngữ (sử dụng mã tiền tệ ISO 4217 ).
(2500).toLocaleString("en-GB", {style: "currency", currency: "GBP", minimumFractionDigits: 2})
Ví dụ đoạn mã Rand của Nam Phi cho @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
Tôi nghĩ những gì bạn muốn là f.nettotal.value = "$" + showValue.toFixed(2);
Numeral.js - thư viện js để định dạng số dễ dàng bởi @adamwdraper
numeral(23456.789).format('$0,0.00'); // = "$23,456.79"
Ok, dựa trên những gì bạn nói, tôi đang sử dụng điều này:
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;
Tôi sẵn sàng để đề xuất cải tiến (tôi không muốn bao gồm YUI chỉ để làm điều này :-)) Tôi đã biết rằng tôi nên phát hiện "." thay vì chỉ sử dụng nó như dấu phân cách thập phân ...
Tôi sử dụng thư viện Toàn cầu hóa (từ Microsoft):
Đây là một dự án tuyệt vời để bản địa hóa các số, tiền tệ và ngày tháng và để chúng tự động được định dạng đúng cách theo địa điểm người dùng! ... và mặc dù nó phải là một phần mở rộng của jQuery, hiện tại nó là một thư viện độc lập 100%. Tôi đề nghị tất cả các bạn để thử nó! :)
javascript-number-formatter (trước đây tại Google Code )
#,##0.00
hoặc có phủ định -000.####
.# ##0,00
, #,###.##
, #'###.##
hoặc bất kỳ loại hình biểu tượng không đánh số.#,##,#0.000
hoặc #,###0.##
đều hợp lệ##,###,##.#
hoặc 0#,#00#.###0#
là tất cả OK.format( "0.0000", 3.141592)
.(trích từ README của nó)
+1 cho Jonathan M để cung cấp phương thức ban đầu. Vì đây rõ ràng là một công cụ định dạng tiền tệ, tôi đã tiếp tục và thêm ký hiệu tiền tệ (mặc định là '$') vào đầu ra và thêm dấu phẩy mặc định là dấu phân cách hàng nghìn. Nếu bạn không thực sự muốn một ký hiệu tiền tệ (hoặc hàng ngàn dấu phân cách), chỉ cần sử dụng "" (chuỗi trống) làm đối số cho 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
là điều duy nhất có vẻ hơi kỳ lạ (với tôi dù thế nào đi nữa).
this
là một tên biến hoàn toàn hữu ích. Chuyển đổi nó thành n
để bạn có thể lưu 3 ký tự ở thời điểm xác định có thể là cần thiết trong thời đại khi RAM và băng thông được tính bằng KB, nhưng chỉ đơn thuần là bị che khuất trong thời đại mà công cụ khai thác sẽ xử lý tất cả những gì trước khi nó bắt đầu sản xuất. Các tối ưu hóa vi thông minh khác ít nhất là gây tranh cãi.
Có một cổng javascript của hàm PHP "number_format".
Tôi thấy nó rất hữu ích vì nó dễ sử dụng và dễ nhận biết cho các nhà phát triển 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;
}
(Khối nhận xét từ bản gốc , bao gồm bên dưới cho ví dụ & tín dụng khi đến hạn)
// 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'
Một phương pháp ngắn hơn (để chèn không gian, dấu phẩy hoặc điểm) với biểu thức chính quy?
Number.prototype.toCurrencyString=function(){
return this.toFixed(2).replace(/(\d)(?=(\d{3})+\b)/g,'$1 ');
}
n=12345678.9;
alert(n.toCurrencyString());
Không thấy bất cứ điều gì như thế này. Nó khá súc tích và dễ hiểu.
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)
)
Đây là phiên bản có nhiều tùy chọn hơn ở đầu ra cuối cùng để cho phép định dạng các loại tiền tệ khác nhau ở các định dạng địa phương khác nhau.
// 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)
)
Câu trả lời của Patrick Desjardins có vẻ tốt, nhưng tôi thích javascript của tôi đơn giản. Đây là một chức năng tôi vừa viết để lấy một số và trả lại ở định dạng tiền tệ (trừ ký hiệu đô la)
// 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];
}
Phần chính là chèn hàng nghìn dấu phân cách, có thể được thực hiện như thế này:
<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)));">
Có một function
toFixed tích hợp trongjavascript
var num = new Number(349);
document.write("$" + num.toFixed(2));
toFixed()
toFixed()
là một chức năng của Number
đối tượng và sẽ không hoạt động var num
nếu nó là một String
, vì vậy bối cảnh bổ sung đã giúp tôi.
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;
}
Từ WillMaster .
Tôi đề nghị lớp NumberFormat từ Google Visualization API .
Bạn có thể làm một cái gì đó như thế này:
var formatter = new google.visualization.NumberFormat({
prefix: '$',
pattern: '#,###,###.##'
});
formatter.formatValue(1000000); // $ 1,000,000
Tôi hy vọng nó sẽ giúp.
Điều này có thể hơi muộn, nhưng đây là một phương pháp tôi vừa làm cho đồng nghiệp để thêm .toCurrencyString()
chức năng nhận biết miền địa phương cho tất cả các số. Việc nội địa hóa chỉ dành cho nhóm số, KHÔNG phải là ký hiệu tiền tệ - nếu bạn xuất ra đô la, hãy sử dụng "$"
như được cung cấp, bởi vì $123 4567
ở Nhật Bản hoặc Trung Quốc có cùng số USD như $1,234,567
ở Mỹ. Nếu bạn xuất ra đồng euro / v.v., thì hãy thay đổi ký hiệu tiền tệ từ đó "$"
.
Khai báo điều này ở bất cứ đâu trong ĐẦU của bạn hoặc bất cứ nơi nào cần thiết, ngay trước khi bạn cần sử dụng nó:
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;
}
Vậy là xong! Sử dụng (number).toCurrencyString()
bất cứ nơi nào bạn cần để xuất số dưới dạng tiền tệ.
var MyNumber = 123456789.125;
alert(MyNumber.toCurrencyString()); // alerts "$123,456,789.13"
MyNumber = -123.567;
alert(MyNumber.toCurrencyString()); // alerts "$-123.57"
Như thường lệ, có nhiều cách để làm điều tương tự nhưng tôi sẽ tránh sử dụng Number.prototype.toLocaleString
vì nó có thể trả về các giá trị khác nhau dựa trên cài đặt của người dùng.
Tôi cũng không khuyên bạn nên mở Number.prototype
rộng các nguyên mẫu - mở rộng đối tượng gốc là một cách làm xấu vì nó có thể gây xung đột với mã của người khác (ví dụ: thư viện / khung / plugin) và có thể không tương thích với các phiên bản / triển khai JavaScript trong tương lai.
Tôi tin rằng Biểu thức chính quy là cách tiếp cận tốt nhất cho vấn đề, đây là cách thực hiện của tôi:
/**
* 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);
}
}
chỉnh sửa vào ngày 2010/08/30: thêm tùy chọn để đặt số chữ số thập phân. chỉnh sửa vào ngày 23 tháng 8 năm 2011: thêm tùy chọn để đặt số chữ số thập phân thành không.
Dưới đây là một số giải pháp, tất cả đều vượt qua bộ kiểm tra, bộ kiểm tra và điểm chuẩn bao gồm, nếu bạn muốn sao chép và dán để kiểm tra, hãy thử This Gist .
Dựa trên https://stackoverflow.com/a/14428340/1877620 , nhưng sửa nếu không có dấu thập phân.
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));
}
Nếu chúng tôi muốn phân tách hàng nghìn hoặc dấu phân cách tùy chỉnh, hãy sử dụng 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,")
Một tùy chọn đơn giản cho vị trí dấu phẩy thích hợp bằng cách đảo ngược chuỗi đầu tiên và biểu thức chính quy.
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();
};
Tôi tìm thấy điều này từ: billing.js . Nó rất dễ dàng và hoàn toàn phù hợp với nhu cầu của tôi.
// 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
trong javascript