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

Javascript 如何将数字格式化为货币字符串,javascript,formatting,currency,Javascript,Formatting,Currency,我想用JavaScript格式化一个价格。我想要一个函数,它接受一个float作为参数,并返回一个string格式如下: "$ 2,500.00" <script type="text/javascript"> function ins1000Sep(val) { val = val.split("."); val[0] = val[0].split("").reverse().jo

我想用JavaScript格式化一个价格。我想要一个函数,它接受一个
float
作为参数,并返回一个
string
格式如下:

"$ 2,500.00"
<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)));">
var formatter = new google.visualization.NumberFormat({
    prefix: '$',
    pattern: '#,###,###.##'
});

formatter.formatValue(1000000); // $ 1,000,000

最好的方法是什么?

主要部分是插入千个分离器,可以这样做:

"$ 2,500.00"
<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)));">
var formatter = new google.visualization.NumberFormat({
    prefix: '$',
    pattern: '#,###,###.##'
});

formatter.formatValue(1000000); // $ 1,000,000

功能ins1000Sep(val){
val=val.split(“.”);
val[0]=val[0]。拆分(“”)。反向()连接(“”);
val[0]=val[0]。替换(/(\d{3})/g,“$1”);
val[0]=val[0]。拆分(“”)。反向()连接(“”);
val[0]=val[0]。索引(“,”==0?val[0]。子字符串(1):val[0];
返回val.join(“.”);
}
功能rem1000Sep(val){
返回值替换(/,/g,“”);
}
函数formatNum(val){
val=数学四舍五入(val*100)/100;
val=(“”+val).indexOf(“.”>-1?val+“00”:val+“.00”;
var dec=val.indexOf(“.”);
返回dec==val.length-3 | | dec==0?val:val.substring(0,dec+3);
}
此解决方案与每个主要浏览器兼容:

  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)
您只需添加货币符号(例如,
“$”+利润。toFixed(2)
)即可获得美元金额

自定义函数 如果需要在每个数字之间使用
,则可以使用此功能:

函数格式货币(数字、小数位数、小数位数、千位数){
decPlaces=isNaN(decPlaces=Math.abs(decPlaces))?2:decPlaces,
decSep=decSep的类型==“未定义”?“:decSep;
千分位=千分位的类型==“未定义”?,“:千分位;
变量符号=数字<0?-:“”;
var i=String(parseInt(number=Math.abs(number(number)| | 0).toFixed(deplaces));
var j=(j=i.length)>3?j%3:0;
返回标志+
(j?i.substr(0,j)+千步:)+
i、 替换(/(\decSep{3})(?=\decSep)/g,“$1”+000英尺)+
(十位数?十位数+Math.abs(number-i).toFixed(十位数).slice(2):“”);
}
document.getElementById(“b”).addEventListener(“单击”,事件=>{
document.getElementById(“x”).innerText=“结果为:”+formatMoney(document.getElementById(“d”).value);
});
插入您的金额:

获得输出

(按下按钮获取输出)

查看JavaScript对象,看看它是否能帮助您

  • toLocaleString()
    将使用特定于位置的千位分隔符格式化数字
  • toFixed()
    将数字四舍五入到特定的小数位数
要同时使用这些值,必须将其类型更改回数字,因为它们都输出一个字符串

例如:

Number((someNumber).toFixed(1)).toLocaleString()
函数当前格式(金额)
{
var i=浮动(金额);
如果(isNaN(i)){i=0.00;}
var负=“”;
如果(i<0){负='-';}
i=Math.abs(i);
i=parseInt((i+.005)*100);
i=i/100;
s=新字符串(i);
如果(s.indexOf('.')<0){s+='.00';}
如果(s.indexOf('.')==(s.length-2)){s+='0';}
s=负+s;
返回s;
}

从。

好的,根据你说的,我用这个:

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;
我对改进建议持开放态度(我不希望仅仅为了做到这一点而包括:-))


我已经知道我应该检测“.”而不是仅仅将其用作十进制分隔符…

有一个PHP函数“number\u format”的JavaScript端口

我发现它非常有用,因为它易于使用,并且对于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 Internet Explorer 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;
}
下面是添加了一些注释和一些小改动的代码:

/*
decimal_sep: character used as decimal separator, 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 the 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 [https://stackoverflow.com/questions/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) : '');
}
小的改变是:

  • 移动了一点
    Math.abs(小数)
    仅在非
    NaN
    时执行

  • decimal\u sep
    不能再为空字符串(必须使用某种小数分隔符)

  • 我们使用中建议的
    typeof数千_sep==='undefined'

  • (+n | | 0)
    是不需要的,因为
    这个
    是一个
    数字
    对象


  • 通常,有多种方法可以做相同的事情,但我会避免使用
    Number.prototype.toLocaleString
    ,因为它可以根据用户设置返回不同的值

    我也不建议扩展
    编号。prototype
    -扩展本机对象原型是一种不好的做法,因为它可能会与其他人的代码(例如库/框架/插件)发生冲突,并且可能与未来的JavaScript实现/版本不兼容

    我相信正则表达式是解决这个问题的最佳方法,下面是我的实现:

    /**
     * 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);
        }
    }
    
    /**
    *将数字转换为货币格式
    *@param{number}应转换的编号。
    *@param{string}[decimalSeparator]十进制分隔符,默认为“.”。
    *@param{string}[thounandsseparator]千位分隔符,默认为“,”。
    *@param{int}[nDecimalDigits]小数位数,默认为'2'。
    *@return{string}格式字符串(例如numberToCurrency(12345.67)返回'12345.67')
    */
    函数编号货币(数字、小数分隔符、千位分隔符、非十进制数字){
    //默认值
    小数分隔符=小数分隔符| |';
    千分之差=千分之差| |',';
    nDecimalDigits=nDecimalDigits==null?2:nDecimalDigits;
    var fixed=number.toFixed(nDecimalDigits),//限制/添加十进制数字
    parts=new RegExp('^('-\\\d{1,3})((?:\\d{3})+(\\.(\\d{'+nDecimalDigits+'}))?$).exec(fixed);//分开的开始[$1],中间[$2]和十进制数字[$4]
    
    如果(部分){//number>=1000 | | number这里有另一个尝试,只是为了好玩:

    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];
    }
    
    以及一些测试:

    // 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));
    
    formatDollar(45664544.23423) // "$45,664,544.23"
    formatDollar(45) // "$45.00"
    formatDollar(123) // "$123.00"
    formatDollar(7824) // "$7,824.00"
    formatDollar(1) // "$1.00"
    
    它也将处理负数。

    (以前)

    • 短小、快速、灵活但独立
    • 接受标准的数字格式,如
      ,###0.00
      或带否定的
      -000.###
    • 接受任何国家/地区格式,如
      ###0,00
      #、###f.nettotal.value = "$" + showValue.toFixed(2);
      
      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) : "");
      };
      
      var myMoney = 3543.75873;
      var formattedMoney = '$' + myMoney.formatMoney(2, ',', '.'); // "$3,543.76"
      
      var num = new Number(349);
      document.write("$" + num.toFixed(2));
      
      // 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];
      }
      
      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) : "");
      };
      
      numeral(23456.789).format('$0,0.00'); // = "$23,456.79"
      
      var formatter = new google.visualization.NumberFormat({
          prefix: '$',
          pattern: '#,###,###.##'
      });
      
      formatter.formatValue(1000000); // $ 1,000,000
      
      (12345.67).toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');  // 12,345.67
      
      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"
      
      /**
       * 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"
      
      /**
       * 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"
      
        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;
        }
      
      var MyNumber = 123456789.125;
      alert(MyNumber.toCurrencyString()); // alerts "$123,456,789.13"
      MyNumber = -123.567;
      alert(MyNumber.toCurrencyString()); // alerts "$-123.57"
      
      // Create our number formatter.
      var formatter = new Intl.NumberFormat('en-US', {
        style: 'currency',
        currency: 'USD',
      
        // These options are needed to round to whole numbers if that's what you want.
        //minimumFractionDigits: 0, // (this suffices for whole numbers, but will print 2500.10 as $2,500.1)
        //maximumFractionDigits: 0, // (causes 2500.99 to be printed as $2,501)
      });
      
      formatter.format(2500); /* $2,500.00 */
      
      (2500).toLocaleString('en-US', {
        style: 'currency',
        currency: 'USD',
      }); /* $2,500.00 */
      
      (2500).toLocaleString("en-GB", {style: "currency", currency: "GBP", minimumFractionDigits: 2})
      
      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));
      }
      
      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, the 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();
      
      amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' });