如何将数字格式化为货币字符串?

我想用JavaScript格式化价格。我想要一个以a float作为参数并返回如下string格式的函数

"$ 2,500.00"

最好的方法是什么?

Tony西门古一2020/03/09 19:46:07

我发现这个来自:accounting.js它非常简单,非常适合我的需求。

// 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€ 

神奇米亚神乐2020/03/09 19:46:07

帕特里克·德斯贾丁(Patrick Desjardins,前Daok)的榜样对我来说非常有效。如果有人感兴趣,我会移植到coffeescript。

Number.prototype.toMoney = (decimals = 2, decimal_separator = ".", thousands_separator = ",") ->
    n = this
    c = if isNaN(decimals) then 2 else Math.abs decimals
    sign = if n < 0 then "-" else ""
    i = parseInt(n = Math.abs(n).toFixed(c)) + ''
    j = if (j = i.length) > 3 then j % 3 else 0
    x = if j then i.substr(0, j) + thousands_separator else ''
    y = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_separator)
    z = if c then decimal_separator + Math.abs(n - i).toFixed(c).slice(2) else ''
    sign + x + y + z
ItachiEva2020/03/09 19:46:07

有一个内置的function toFixedjavascript

var num = new Number(349);
document.write("$" + num.toFixed(2));
小小Near阳光2020/03/09 19:46:07

主要部分是插入千位分隔符,可以这样完成:

<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)));">
泡芙理查德2020/03/09 19:46:07

我使用了Globalize(来自Microsoft):

这是一个很棒的项目,可以对数字,货币和日期进行本地化,并根据用户区域设置以正确的方式自动设置它们的格式!...尽管它应该是jQuery扩展,但目前是100%独立的库。我建议大家尝试一下!:)

猿前端猿2020/03/09 19:46:07

我想你想要的是 f.nettotal.value = "$" + showValue.toFixed(2);

Stafan西门2020/03/09 19:46:07

适用于所有当前浏览器

用于toLocaleString以语言敏感的形式格式化货币(使用ISO 4217货币代码)。

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

@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

泡芙小卤蛋2020/03/09 19:46:07

这里已经有一些不错的答案。这是另一种尝试,只是为了好玩:

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

和一些测试:

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

编辑:现在它将处理负数

2020/03/09 19:46:06

accounting.js是一个小巧的JavaScript库,用于数字,货币和货币格式设置。

小卤蛋Davaid2020/03/09 19:46:06

查看JavaScript Number对象,看看它是否可以为您提供帮助。

  • toLocaleString() 将使用特定于位置的千位分隔符格式化数字。
  • toFixed() 将数字四舍五入到特定的小数位数。

要同时使用它们,必须将值的类型改回数字,因为它们都输出字符串。

例:

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