JavaScript数字拆分为单个数字

109

我正在尝试解决一个数学问题,其中我接收一个数字,例如45111,然后将该数字分解为单独的数字,例如4 51 1 1。然后,我会将每个数字保存到变量中以运行一个方法。有人知道如何将数字拆分成单个数字吗?

例如,我有一个在数组上运行的循环:

for (var i = 0; i < range.length; i++) {
  var n = range[i];
}

对于每个数字,我想要将其数字拆分并将它们相加。

30个回答

138

var num = 123456;
var digits = num.toString().split('');
var realDigits = digits.map(Number)
console.log(realDigits);


17
加上 var realDigits = digits.map(Number),我们就达成协议了。 - Alex Pyzhianov
"555".split('').map(Number) - NVRM
1
在处理大量数据时(例如Math.pow(10,100)),它的表现非常出色。 - Gyum Fox
这个在处理大数时会出现问题,比如 1e100.toString().split(''); 的结果是 [ "1", "e", "+", "1", "0", "0" ] - Stefnotch

81
var number = 12354987,
    output = [],
    sNumber = number.toString();

for (var i = 0, len = sNumber.length; i < len; i += 1) {
    output.push(+sNumber.charAt(i));
}

console.log(output);

/* Outputs:
 *
 * [1, 2, 3, 5, 4, 9, 8, 7]
 */ 

更新: 计算总和

for (var i = 0, sum = 0; i < output.length; sum += output[i++]);
console.log(sum);

/*
 * Outputs: 39
 */

将所有数字动态相加,考虑到数字长度可能是任意长度,那么添加起来会有多容易? - jonnyhitek
@jonnyhitek,对我来说速度很快 - http://i.imgur.com/TTGZL.png - Chrome 14 @ Win7。还有一个jsfiddle:http://jsfiddle.net/Lapple/ZmS3B/ - Lapple
可能你的浏览器不支持 console API — 将 console 改为 alert - Lapple
不,我认为这是我的错误。我正在尝试在我的循环中运行您的代码。 - jonnyhitek
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/4307/discussion-between-jonnyhitek-and-lapple - jonnyhitek
显示剩余2条评论

62

您也可以使用“数学”方法而无需将数字视为字符串:

var num = 278;
var digits = [];
while (num != 0) {
    digits.push(num % 10);
    num = Math.trunc(num / 10);
}
digits.reverse();
console.log(digits);

我能看到的一个好处是你不必对每个数字运行 parseInt(),因为你正在处理实际的数字作为数值。


我试图解决一个算法问题,需要我在不将数字转换为字符串的情况下对其进行拆分。这个方法可以用于正数,但不能用于负数。负数返回空数组。 - Hoxtygen
@Hoxtygen 你说得对,我不知道为什么假设只有正数。我已经修复了代码,请看编辑后的版本。基本上,我只是将循环停止条件更改为在达到零时停止,而以前它也会在负数上停止。 - Shadow The Spring Wizard
太棒了,这个确实可以正确处理大数字,不像最佳答案那样! - Stefnotch
这个还没有用负数进行测试,对吗?返回 [ -2, -7, -8 ] 作为 -278 看起来是一个有趣的选择。 - Stefnotch
1
@Stefnotch 进行了非空测试,这是去年12月份“报告”的“错误”。但你提出了一个有趣的观点,例如“-2”虽然不严格属于数字,但它确实有助于知道原始数字是负数。可以通过对输入进行Math.abs()来简单地忽略数字为负的情况,但如果你确实想保留这个细节,就需要其他方法。所以归根结底,在这种情况下无法事先知道要求。 - Shadow The GPT Wizard

37

我找到的是最短的代码,尽管它会将数字作为字符串返回:

let num = 12345;

[...num+''] //["1", "2", "3", "4", "5"]

或者使用以下代码将其转换为整数:

[...num+''].map(n=>+n) //[1, 2, 3, 4, 5]

15

我将提供一个已经给出答案的变体,这样你就可以看到一个不同的方法,可以始终保留数字类型:

var number = 12354987,
    output = [];

while (number) {
    output.push(number % 10);
    number = Math.floor(number/10);
}

console.log(output.reverse().join(',')); // 1,2,3,5,4,9,8,7

我曾经使用类似上述的技巧,成功地将数字转换为罗马数字。这是我学习不熟悉编程语言的最喜欢方式之一。例如,这是我如何在本世纪初使用Tcl设计了一个将数字转换为罗马数字的方法:http://code.activestate.com/recipes/68379-conversion-to-roman-numerals/

我的Tcl脚本中相应的行:

  while {$arabic} {
    set digit [expr {$arabic%10}]
    set arabic [expr {$arabic/10}]

1
很遗憾,% 运算符的第一个合理使用在答案列表中排名如此之低。 - Sergey Orlov
感谢持续的点赞,但考虑到 ES5 和/或 ES6,这个答案现在几乎已经不再有效了。即使它仍然存在,我也应该指定 output.unshift(而不是 push),从而使 reverse() 不必要--很多人会忽略 unshift - Dexygen
@GeorgeJempty,感谢您强调保留数字类型的重要性。昨天我花了太多时间解决由字符串输入引起的基础转换问题。如果您有任何与ES5/ES6和/或output.unshift相关的更新,请告知我,我将不胜感激。 - CODE-REaD

10

// Split positive integer n < 1e21 into digits:
function digits(n) {
  return Array.from(String(n), Number);
}

// Example:
console.log(digits(1234)); // [1, 2, 3, 4]


8
使用Stringsplitmap
String(number).split("").map(Number);

function splitNum(num) {
    return String(num).split("").map(Number);
}

console.log(splitNum(1523)); // [1, 5, 2, 3]
console.log(splitNum(2341)); // [2, 3, 4, 1]
console.log(splitNum(325)); // [3, 2, 5]


字符串会去掉零。有没有办法让零不被移除? - Graphics Factory
你是指数字后面的零吗?因为那些不会被去掉。如果你是指数字前面的0,那么一个变量怎么可能在数字前面有一个零呢?例如001234已经是一个字符串而不是整数。 - Blackjack

5
您可以使用字符串而不是数字来实现这一点。您可以像这样做:
(111 + '').split('')

这将返回一个字符串数组 ['1','1','1'],你可以对其进行迭代并调用 parseInt 方法。

parseInt('1') === 1

如果你想要个位数的总和,可以使用reduce函数(从Javascript 1.8实现)进行如下操作。
(111 + '').split('').reduce(function(previousValue, currentValue){  
  return parseInt(previousValue,10) + parseInt(currentValue,10);  
})

4

不转换为字符串:

function toDigits(number) {
    var left;
    var results = [];

    while (true) {
        left = number % 10;
        results.unshift(left);
        number = (number - left) / 10;
        if (number === 0) {
            break;
        }
    }

    return results;
}

4
使用 String、... 和 map。

const num = 7890;

const digits = [...String(num)].map(Number);

console.log(digits)

或者,使用...reduce来获取数字及其总和。

const sumOfDigits = num => [...""+num].reduce((acc, dig) => acc + +dig, 0);

console.log('Sum of digits: ', sumOfDigits(7890));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接