如何在JavaScript中将数字格式设置为美元货币字符串?

我想用JavaScript格式化一个价格。
我想要一个函数,它将float作为参数并返回一个格式如下所示的string

"$ 2,500.00"

什么是最好的方法来做到这一点?


您可以使用:

  var profits=2489.8237
  profits.toFixed(3) //returns 2489.824 (round up)
  profits.toFixed(2) //returns 2489.82
  profits.toFixed(7) //returns 2489.8237000 (padding)

然后你可以添加'$'的符号。

如果你需要','为数千,你可以使用:

Number.prototype.formatMoney = function(c, d, t){
    var n = this, 
    c = isNaN(c = Math.abs(c)) ? 2 : c, 
    d = d == undefined ? "." : d, 
    t = t == undefined ? "," : t, 
    s = n < 0 ? "-" : "", 
    i = String(parseInt(n = Math.abs(Number(n) || 0).toFixed(c))), 
    j = (j = i.length) > 3 ? j % 3 : 0;
   return s + (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) : "");
 };

并与它一起使用:

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

如果你总是要使用'。' 和',',您可以将它们从您的方法调用中除去,并且该方法将为您默认它们。

(123456789.12345).formatMoney(2);

如果您的文化具有翻转的两个符号(即欧洲人),则只需粘贴formatMoney方法中的以下两行formatMoney

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

简短的解决方案#1:

n.toFixed(2).replace(/(d)(?=(d{3})+.)/g, '$1,');

简短的解决方案#2:

n.toFixed(2).replace(/./g, function(c, i, a) {
    return i && c !== "." && ((a.length - i) % 3 === 0) ? ',' + c : c;
});

测试:

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/

如果您不希望数字末尾有小数点,请使用以下正则表达式:

n.toFixed().replace(/(d)(?=(d{3})+(,|$))/g, '$1,')

扩展方案:

您还可以扩展Number对象的原型以添加任意小数数[0 .. n]额外支持和数组[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"

演示/测试: http : //jsfiddle.net/hAfMM/435/


超级解决方案:

在这个超级扩展版本中,您可以设置不同的分隔符类型:

/**
 * 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"

演示/测试: http : //jsfiddle.net/hAfMM/612/


Intl.numberformat

Javascript有一个数字格式化程序,它是国际化API的一部分。

// Create our number formatter.
var formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
  minimumFractionDigits: 2,
  // the default value for minimumFractionDigits depends on the currency
  // and is usually already 2
});

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

JS小提琴

关于浏览器支持的一些说明

  • 所有主流浏览器都支持它
  • 支持方面最大的罪犯是UC Mobile(远离那个)和Opera Mini(由于设计而瘫痪)
  • 在旧版浏览器上有一个支持它的垫片
  • 查看CanIUse以获取更多信息
  • Intl.NumberFormat与Number.prototype.toLocaleString

    最后一张照片比较这与老年人。 toLocaleString 。 它们都提供基本相同的功能。 然而,toLocaleString在其旧版本(pre-Intl)中实际上并不支持语言环境:它使用系统区域设置。 因此,为确保您使用的是正确的版本,MDN建议检查Intl的存在。 所以如果你需要检查Intl,为什么不使用它呢? 但是,如果您选择使用垫片,那也会修补到toLocaleString ,所以在这种情况下您可以毫无麻烦地使用它:

    (2500).toLocaleString('en-US', {
      style: 'currency',
      currency: 'USD',
    }); /* $2,500.00 */
    
    链接地址: http://www.djcxy.com/p/13551.html

    上一篇: How can I format numbers as dollars currency string in JavaScript?

    下一篇: UIWebview resize height to fit content