【问题标题】:What is the JS equivalent to the PHP function number_format?什么是JS等价于PHP函数number_format?
【发布时间】:2012-10-10 13:18:58
【问题描述】:

PHP函数:

function formatNumberForDisplay($number, $decimal=0, $decimalSeperator='.', $numberSeperator=',')
{
     return number_format($number, $decimal, $decimalSeperator, $numberSeperator);
}

谁能向我推荐 jQuery/JavaScript 中的等效功能?

【问题讨论】:

标签: php javascript jquery


【解决方案1】:

js中与number_format相同的等价物可以找到here

function number_format (number, decimals, dec_point, thousands_sep) {
    // Strip all characters but numerical ones.
    number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
    var n = !isFinite(+number) ? 0 : +number,
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.round(n * k) / k;
        };
    // Fix for IE parseFloat(0.55).toFixed(0) = 0;
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}

【讨论】:

  • 尽管这是很久以前发布的,但我仍然认为我会说声谢谢 - 这个绝妙的答案拯救了我的一天!
【解决方案2】:

只需在整数对象上使用toLocaleString

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString#Browser_compatibility

let x = 1234567;
//if x is a string/non-number, use parseInt/parseFloat to convert to a number. Thanks @Aleksandr Kopelevich
x.toLocaleString('us', {minimumFractionDigits: 2, maximumFractionDigits: 2})

【讨论】:

  • 这应该是正确的答案。但是只有一件事:此功能不适用于字符串。因此,如果您直接从 JSON 对象(例如)获取值,请将 parseInt() 或 parseFloat() 应用于此字符串。
【解决方案3】:

这是你想要的吗?

yourFloatVarHere.toFixed(2);

瞧。

【讨论】:

  • @MoVod:格式化数字如 1 340.23 或 1,340.00(注意千位分隔符)怎么样?
  • toFixed() 在小数点 >5 时向上取整,但 php 中的 number_format() 在小数点 >=5 时向上取整。我在验证时遇到问题
  • 不幸的是,这甚至无法完成 PHP 的 number_format() 的一半工作。
  • 不足。如果你运行(95**12).toFixed(0),你会得到"5.40360087662637e+23",但如果你在php中运行number_format(95**12,0),你会得到540,360,087,662,636,990,201,856
【解决方案4】:

本机“国际”对象方法:

var amount = 5000.25;
var locale = 'de';
var options = {style: 'currency', currency: 'eur', minimumFractionDigits: 2, maximumFractionDigits: 2};
var formatter = new Intl.NumberFormat(locale, options);

console.log(formatter.format(amount));

http://jsfiddle.net/arturrelax/sa9jL138/1/

更多信息请访问:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl

【讨论】:

  • 浏览器兼容性说明:不支持 Mobile Safari 和 IE
【解决方案5】:

我知道这是一个旧线程,但我用纯 Javascript 编写了自己的函数。

简单的解决方案

https://gist.github.com/VassilisPallas/d73632e9de4794b7dd10b7408f7948e8/bf17eccef8521b4e5869bdc6a5b09a771356fbff

这适用于有限数

function number_format(number, decimals, dec_point, thousands_point) {

    if (number == null || !isFinite(number)) {
        throw new TypeError("number is not valid");
    }

    if (!decimals) {
        var len = number.toString().split('.').length;
        decimals = len > 1 ? len : 0;
    }

    if (!dec_point) {
        dec_point = '.';
    }

    if (!thousands_point) {
        thousands_point = ',';
    }

    number = parseFloat(number).toFixed(decimals);

    number = number.replace(".", dec_point);

    var splitNum = number.split(dec_point);
    splitNum[0] = splitNum[0].replace(/\B(?=(\d{3})+(?!\d))/g, thousands_point);
    number = splitNum.join(dec_point);

    return number;
}

复杂解决方案

这解决了大数字的问题

https://gist.github.com/VassilisPallas/d73632e9de4794b7dd10b7408f7948e8

 const splitThousands = (number) => (dec_point, thousands_point) => {
  const splitNum = number.toString().split(dec_point);
  splitNum[0] = splitNum[0].replace(/\B(?=(\d{3})+(?!\d))/g, thousands_point);
  return splitNum.join(dec_point);
};

const isBigNumber = (number) => number.toString().includes("e");

const isBigFloat = (number) => number.toString().includes("-");

const calcTrailing = (dec, len) => Number(dec) + 2 - len;

const handleBigFloats = (number, decimals) => {
  if (!decimals) {
    return "0";
  }

  const [numbers, dec] = number.toString().replace(".", "").split("e-");
  const trailingZeros = calcTrailing(dec, numbers.length);
  const res = `${"0.".padEnd(trailingZeros + 2, "0")}${numbers}`;

  return decimals ? res.substring(0, 2) + res.substring(2, decimals + 2) : res;
};

const handleBigNumbers = (number, decimals, dec_point, thousands_point) => {
  if (isBigFloat(number)) {
    return handleBigFloats(number, decimals);
  }

  return splitThousands(BigInt(number))(dec_point, thousands_point);
};

function handleFiniteNumbers(number, decimals, dec_point, thousands_point) {
  if (!isFinite(number)) {
    throw new TypeError("number is not finite number");
  }

  if (!decimals) {
    const len = number.toString().split(".").length;
    decimals = len > 1 ? len : 0;
  }

  return splitThousands(
    parseFloat(number).toFixed(decimals).replace(".", dec_point)
  )(dec_point, thousands_point);
}

const numberFormat = (
  number,
  decimals,
  dec_point = ".",
  thousands_point = ","
) => {
  if (number == null || typeof number !== "number") {
    throw new TypeError("number is not valid");
  }

  if (isBigNumber(number)) {
    return handleBigNumbers(number, decimals, dec_point, thousands_point);
  }

  return handleFiniteNumbers(number, decimals, dec_point, thousands_point);
};

https://jsfiddle.net/p2ft9n4v/1/

【讨论】:

  • 发现了一个错误:如果你在你的函数中运行number_format(95**12,0),你会得到"5.40360087662637e+23",但是如果你在php中运行它,你会得到"540,360,087,662,636,990,201,856"
【解决方案6】:

更接近 php 的函数 number_format($number) 应该是 javascript 的 number.toLocaleString('en')

【讨论】:

  • 这是一个很好的建议。为了更进一步,我将 parseInt() 添加到它: parseInt(data).toLocaleString('en');
【解决方案7】:

这是另一个简短的解决方案,其行为应该类似于 php 等效项。

function number_format(number,decimals,dec_point,thousands_sep) {
    number  = number*1;//makes sure `number` is numeric value
    var str = number.toFixed(decimals?decimals:0).toString().split('.');
    var parts = [];
    for ( var i=str[0].length; i>0; i-=3 ) {
        parts.unshift(str[0].substring(Math.max(0,i-3),i));
    }
    str[0] = parts.join(thousands_sep?thousands_sep:',');
    return str.join(dec_point?dec_point:'.');
}

【讨论】:

  • 喜欢这种简短的功能。但是,我们必须通过在函数的第一行添加 number = number*1; 来强制将 number 作为数字/整数。因为有时候浏览器把它识别为字符串,然后toFixed函数就不会被识别(undefined function number.toFixed())
【解决方案8】:

这是一个简单的函数,你可以使用它来实现与 php 中的 number_format 几乎相同的结果:

function number_format(user_input){
    var filtered_number = user_input.replace(/[^0-9]/gi, '');
    var length = filtered_number.length;
    var breakpoint = 1;
    var formated_number = '';

    for(i = 1; i <= length; i++){
        if(breakpoint > 3){
            breakpoint = 1;
            formated_number = ',' + formated_number;
        }
        var next_letter = i + 1;
        formated_number = filtered_number.substring(length - i, length - (i - 1)) + formated_number; 

        breakpoint++;
    }

    return formated_number;
}

另一种方法是使用 ajax 调用 php 脚本,在该脚本中对数字运行 number_format 并使用 ajax 作为字符串返回。但是有点乱。

【讨论】:

    【解决方案9】:

    这并不容易,尝试使用简单的 jquery 插件,例如:

    jquery-numberformatter

    Jquery-Price-Format

    【讨论】:

      【解决方案10】:

      我对此的看法:

      var number_format = function(num) {
        stringNum = num.toString();
        stringNum = stringNum.split("");
        c = 0;
        if (stringNum.length>3) {
          for (i=stringNum.length; i>-1; i--) {
            if ( (c==3) && ((stringNum.length-i)!=stringNum.length) ) {
              stringNum.splice(i, 0, ",");
              c=0;
            }
            c++
          }
          return stringNum;
        }
        return num;
      }
      
      $("body").append(number_format(100000000));
      

      【讨论】:

        【解决方案11】:

        公开示例的另一种变体:

        const numberFormat = (value, decimals, decPoint, thousandsSep) => {
            decPoint = decPoint || '.';
            decimals = decimals !== undefined ? decimals : 2;
            thousandsSep = thousandsSep || ' ';
        
            if (typeof value === 'string') {
                value = parseFloat(value);
            }
        
            let result = value.toLocaleString('en-US', {
                maximumFractionDigits: decimals,
                minimumFractionDigits: decimals
            });
        
            let pieces = result.split('.');
            pieces[0] = pieces[0].split(',').join(thousandsSep);
        
            return pieces.join(decPoint);
        };
        

        【讨论】:

          【解决方案12】:

          等效的 JS 将是:

          var number = //input value
          
          parseFloat(number).toFixed(3);
          

          【讨论】:

            【解决方案13】:

            我只需要调用 JS 函数就可以了:

            var formattedNumber = number_format(value)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-04-04
              • 1970-01-01
              • 2020-02-28
              • 2011-12-25
              • 1970-01-01
              • 2013-09-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多