将数字转换为数十,数百,数千

时间:2015-12-05 20:51:16

标签: javascript numbers

我需要一个函数,给定一个数字,比方说123,将输出一个数组[100,20,3]。我尝试过这样的事情(借用SO上的另一个问题):

function separateNumberIntoUnits(n) {
    var arr = [];
    var i = 10;

    while (n > i / 10)
    {
        arr.unshift(n % i - n % (i / 10));
        i *= 10;
    }

    return arr;
}

它适用于所有数字,除了10,100等。我试图弄清楚发生了什么,但数学不是我强大的一面......

如果有更有效的方法,请随意编写自己的解决方案。

4 个答案:

答案 0 :(得分:4)

我认为这是最有效的方式:

function separateNumberIntoUnits(n) {
  if (n == 0) return [0];
  // n = Math.floor(n); // needed for decimal numbers
  var arr = [];
  var i = 1;

  while (n > 0) {
    arr.unshift((n % 10) * i);
    n = Math.floor(n / 10);
    i *= 10
  }

  return arr;
}

document.writeln(separateNumberIntoUnits(1234) + "<br />")
document.writeln(separateNumberIntoUnits(100) + "<br />")
document.writeln(separateNumberIntoUnits(10) + "<br />")
document.writeln(separateNumberIntoUnits(1) + "<br />")
document.writeln(separateNumberIntoUnits(0) + "<br />")

unshift是最好的方法:Array.unshift vs Array.push和Array.reverse:https://jsperf.com/array-unshift-vs-array-push-and-array-reverse

答案 1 :(得分:1)

您可以将数字视为字符串。

将其拆分为数字数组,然后乘以适当的10的幂,将每个数字map分成小数位数:

function separateNumberIntoUnits(n) {
  var s= n.toString().split('');
  
  return s.map(function(digit, n) {
    return digit * Math.pow(10, s.length - n - 1);
  });
}

document.body.innerHTML=
  separateNumberIntoUnits(1234) + '<br>' +
  separateNumberIntoUnits(100)  + '<br>' +
  separateNumberIntoUnits(0);

答案 2 :(得分:0)

没有数学的解决方案:

function s(n) {
    return n.toString().split('').reduce(function (r, a) {
        r = r.map(function (b) { return b + '0'; });
        r.push(a);
        return r;
    }, []);
}

document.body.textContent = s(321);

答案 3 :(得分:0)

这是一个易于理解的基本解决方案。需要最少的数学。

function separateUnits(num) { 
    var number = num.toString().split('');
    var multiplier = 1;  

    for (var i = number.length - 1; i >= 0; i--) {
        number[i] *= multiplier;
        multiplier *= 10;
    }
    return number;
}
separateUnits(2134);

输出

[2000, 100, 30, 4]