如何使用regexp或函数将数字格式化为自定义字符串?

时间:2016-09-29 11:12:34

标签: javascript

我需要将数字转换为输出字符串格式。我需要设置一些小数,小数分隔符和千位分隔符。

我已经有了这样的功能:

function (number, decimals, decPoint, thousandsSep) {
    var i, j, kw, kd, km;
    if (isNaN(decimals = Math.abs(decimals))) {
        decimals = 2;
    }
    if (decPoint == undefined) {
        decPoint = ",";
    }
    if (thousandsSep == undefined) {
        thousandsSep = "";
    }
    var sign = number  3) {
        j = j % 3;
    } else {
        j = 0;
    }
    km = (j ? i.substr(0, j) + thousandsSep : "");
    kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousandsSep);
    kd = (decimals ? dec_point + Math.abs(number - (sign + i)).toFixed(decimals).replace(/-/, 0).slice(2) : "");
    return sign + km + kw + kd;
}

但我需要知道,有更快或更简单的方法吗?

3 个答案:

答案 0 :(得分:0)

除了safari number.toLocaleString()之外,所有浏览器都有一种更简单的方法。对于safari,你可以使用你的函数和toLocaleString()用于chrome firefox和ie

答案 1 :(得分:0)

这是我解决问题的方法。

function transform(number, decimals, decPoint, thousandsSep) {
    var splitted = Math.abs(number).toFixed(isNaN(decimals) ? 2 : +decimals).split('.'),
        getSignPart = function (number) {
            return number < 0 ? ['-'] : [];
        },
        getIntPart = function (intPartStr, thousandsSep) {
            var res = intPartStr.split(''), idx;
            for (idx = intPartStr.length - 3; idx > 0; idx -= 3) {
                res.splice(idx, 0, thousandsSep);
            }
            return res;
        },
        getDecPart = function (decPartStr, decPoint) {
            return decPartStr ? [decPoint, decPartStr] : [];
        };

    return getSignPart(number)
            .concat(getIntPart(splitted[0], thousandsSep || ''))
            .concat(getDecPart(splitted[1], decPoint || ','))
            .join('');
}

首先,我将字符串中的数字转换为所需的小数位数(如果未指定,则默认为2)。在js中,.是小数的默认分隔符,因此我使用.进行拆分以获取数字的整数/小数部分。然后,我每3个数字添加千位分隔符(默认为'')并添加decimalSeparator(如果需要,则默认为,)。

希望它有所帮助。

答案 2 :(得分:0)

我会使用toFixed将数字转换为具有所需小数的字符串

将千位分隔符从右边放入数字,分成3个分组的数组,

最后把所有东西连在一起:

var num = 1234567.543;


function formatNum(n,decimals,tSep,dSep){
   if(isNaN(n)) return;

  var r = n.toFixed(decimals || 0)
  var dec = r.match(/\.[0-9]*$/) ? ((dSep || '.') + r.match(/(?!\.)[0-9]*$/)[0]) : '';

  var int =  Math.floor(n).toString() //if you use this for negative numbers use truncation (n | 0) instead of Math.floor(n)
  var intSep = int.split('').reduceRight((ac, x) => {
    if (!ac[0] || ac[0].length === 3)
      ac.unshift([x]);
    else
      ac[0].unshift(x);
    return ac
  },[])
  .map(x => x.join(''))
  .join(tSep || '')
      
  return intSep + dec;
}

console.log(
  formatNum(num, 2,"'",",")
  )