JavaScript编号拆分为单个数字

时间:2011-10-16 13:37:37

标签: javascript math

您好我正在尝试解决数学问题45或111然后将数字分成单独的数字,例如4 5或1 1 1.然后,我将每个数字保存到var以运行方法。有没有人没有如何将数字分成单个数字。

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

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

对于每个号码,我想分割它们的数字并将它们加在一起?

30 个答案:

答案 0 :(得分:67)

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

答案 1 :(得分:52)

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
 */

答案 2 :(得分:18)

您也可以采用“数学”方式进行,而不将数字视为字符串:

var num = 278;
var digits = [];
while (num > 0) {
    digits[digits.length] = num % 10;
    num = parseInt(num / 10);
}
digits.reverse();
alert(digits);

我可以看到的一个好处是,您不必在每个数字上运行parseInt(),而是将实际数字作为数值处理。

Live test case

答案 3 :(得分:9)

我将提供已经给出的答案的变体,以便您可以看到一直保留数字类型的不同方法:

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

我将上述技术用于将数字转换为罗马数字时效果很好,这是我开始学习一种我不熟悉的编程语言的最佳方式之一。例如,这里是我如何设计一种方法,用10年前的Tcl将数字转换为罗马数字:http://code.activestate.com/recipes/68379-conversion-to-roman-numerals/

我的Tcl脚本中可比较的行是:

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

答案 4 :(得分:9)

这是我发现的最短,但它确实将数字作为字符串返回:

let num = 12345;

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

或者用它来取回整数:

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

答案 5 :(得分:4)

您可以使用字符串而不是数字来实现此目的。你可以这样做

(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);  
})

答案 6 :(得分:3)

// 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]

答案 7 :(得分:2)

有趣的递归介绍。该答案取一个数字,并返回一个数字位数的数组。不会将数字转换为字符串作为中间步骤。

给出n = 1234

  • n % 10将返回第一个(右湿)数字4
  • n / 10将返回123,并剩余部分
  • 使用Math.floor,我们可以将剩余部分砍掉
  • 重复这些步骤,我们可以得出整个结果

现在我们只需要构建递归条件,

  • 如果数字已经是一位数字(n <10),则返回该数字的单例数组
  • 否则(归纳)数为10或更大;重复并放在第一位

const digits = (n = 0) =>
  n < 10
    ? [ n ]
    : [ ... digits (Math.floor (n / 10)), n % 10 ]

console.log (digits ())        // [ 0 ]
console.log (digits (1))       // [ 1 ]
console.log (digits (12))      // [ 1, 2 ]
console.log (digits (123))     // [ 1, 2, 3 ]
console.log (digits (11234))   // [ 1, 2, 3, 4 ]

console.log (digits (123456789012))
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2 ]

答案 8 :(得分:1)

最简单的...... num_string.split('').map(Number)

尝试以下:

&#13;
&#13;
console.log((''+123).split('').map(Number))
&#13;
&#13;
&#13;

答案 9 :(得分:1)

使用 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]

答案 10 :(得分:1)

这也有效:

var number = 12354987;
console.log(String(number).split('').map(Number));

答案 11 :(得分:1)

使用ES6,您可以将Array.from和带有字符串的数字分别用作iterablesNumber作为映射函数。

const getDigits = n => Array.from(n.toString(), Number);

console.log(getDigits(12345));

答案 12 :(得分:1)

不转换为字符串:

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;
}

答案 13 :(得分:1)

分开每个2参数。

function separator(str,sep) {
    var output = '';
    for (var i = str.length; i > 0; i-=2) {
        var ii = i-1;
        if(output) {
            output = str.charAt(ii-1)+str.charAt(ii)+sep+output;
        } else {
            output = str.charAt(ii-1)+str.charAt(ii);
        }            
    }
    return output;
}
console.log(separator('123456',':')); //Will return 12:34:56

答案 14 :(得分:1)

Shadow Wizard,Orien的扩展版

var num:Number = 1523;
var digits:Array = [];
var cnt:int = 0;
while (num > 0) {
    var mod:int = num % 10;
    digits.push(mod * Math.pow(10, cnt))

    num = Math.floor(num / 10);
    cnt++;
}
digits.reverse();
trace(digits);

输出:1000,500,20,3

答案 15 :(得分:0)

您可以单行执行,将每个数字分开,然后将它们加在一起:

var may = 12987;
var sep = (""+may).split("").map(n=>+n).reduce((a,b)=>a+b);

答案 16 :(得分:0)

var num = 111,
 separateDigits = num.toString().split(""), i, l = separateDigits.length;

for( i = 0; i < l; ++i ) {
someObject.someMethod( +separateDigits[i] );
}

答案 17 :(得分:0)

使用String...map

const num = 7890;

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

console.log(digits)

答案 18 :(得分:0)

我将发布此答案以介绍unshift的使用,这是一种现代解决方案。使用push,您将添加到数组的末尾,而unshift将添加到数组的末尾。这样一来,数学方法将变得更加强大,因为您不再需要反转。

let num = 278;
let digits = [];
while (num > 0) {
    digits.unshift(num % 10);
    num = parseInt(num / 10);
}
console.log(digits);

答案 19 :(得分:0)

使用for...of语句遍历每个数字。

通过在字符串之前添加+符号,它将被转换为数字。

const num = 143,
  digits = [];

for (const digit of `${num}`) {
  digits.push(+digit)
}
console.log(digits);

@iampopov的启发,您可以使用spread syntax进行编写。

const num = 143;
const digits = [...`${num}`].map(Number);
console.log(digits);

答案 20 :(得分:0)

我可能是错的,但是解决方案却是零碎的。正如我仍在学习的那样,也许这些功能可以在同一功能中完成许多工作。请毫不犹豫地纠正我。

const totalSum = (num) => [...num + ' '].map(Number).reduce((a, b) => a + b);

因此,我们将参数转换为arr并添加空格。我们对每个元素都执行此操作,然后使用map方法将其推入新数组。拆分后,我们使用reduce将所有元素求和并得到总数。

正如我所说,如果看到我不了解的内容,请立即纠正我或改进功能。

差点忘了,以防万一:

const totalSum = (num) => ( num === 0 || num < 0) ? 'I need a positive number' : [...num + ' '].map(Number).reduce((a, b) => a + b);

如果负数或仅是零,则作为参数下降。祝大家编码愉快。

答案 21 :(得分:0)

javascript具有此功能,您可以轻松使用它。

console.log(new Intl.NumberFormat().format(number));

例如:

console.log(new Intl.NumberFormat().format(2334325443534));
==> 2,334,325,443,534

答案 22 :(得分:0)

这是我的简短解决方案..用数字求和

    function sum (num) {
    let sNumber = num
        .toString()
        .split('')
        .reduce((el1, el2) => {
            return Number(el1) + Number(el2)
        }, 0)
        return sNumber
     }
  

console.log(sum(123))
  console.log(sum(456))

答案 23 :(得分:0)

function iterateNumber(N, f) {
    let n = N;
    var length = Math.log(n) * Math.LOG10E + 1 | 0;
    for (let i = 0; i < length; i++) {
        const pow = Math.pow(10, length - i - 1)
        let c = (n - (n % pow)) / pow
        f(c, i)
        n %= pow
    }
}

答案 24 :(得分:0)

('' + 123456789).split('').map( x => +x ).reduce( (a,b) => a+b ) === 45

true

或没有地图

('' + 123456789).split('').reduce( (a,b) => (+a)+(+b) ) === 45

true

答案 25 :(得分:0)

我只是喜欢使用正则表达式,所以只想以相同的顺序将整数拆分成各个数字,因为即使将数字转换为字符串后,它也可以防止丢失数字的身份。

下面的代码行将整数转换为字符串,使用正则表达式匹配字符串中的任何单个数字并返回一个由数字组成的数组,此后该数组将映射为转换回数字。

const digitize = n => String(n).match(/\d/g).map(Number);

答案 26 :(得分:0)

number获取数字的功能方法是从string获取number,将其拆分为array(字符)和将每个元素映射回一个数字。

例如:

var number = 123456;

var array = number.toString()
.split('')
.map(function(item, index) {
   return parseInt(item);
});

console.log(array); // returns [1, 2, 3, 4, 5, 6]

如果您还需要对所有数字求和,可以将reduce()方法附加到上一个代码:

var num = 123456;

var array = num.toString()
.split('')
.map(function(item, index) {
   return parseInt(item);
})
.reduce(function(previousValue, currentValue, index, array) {
  return previousValue + currentValue;
}, 0);

console.log(array); // returns 21

作为替代方案,使用ECMAScript 2015(第6版),您可以使用arrow functions

var number = 123456;
var array = number.toString().split('').map((item, index) => parseInt(item));
console.log(array); // returns [1, 2, 3, 4, 5, 6]

如果您需要对所有数字求和,可以将reduce()方法附加到上一个代码:

var num = 123456;

var result = num.toString()
.split('')
.map((item, index) => parseInt(item))
.reduce((previousValue, currentValue) => previousValue + currentValue, 0);

console.log(result); // returns 21

答案 27 :(得分:0)

你可以试试这个。

  var num = 99;

  num=num.toString().split("").map(value=>parseInt(value,10)); //output [9,9]

希望这有帮助!

答案 28 :(得分:0)

我用这种简单的方法做到了。

分割数字

var N = 69;
var arr = N.toString().split('').map(Number)
// outputs [6,9]
console.log( arr ); 

将它们添加到一起

console.log(arr.reduce( (a,b) => a+b )); // 15

答案 29 :(得分:-1)

ES6更优雅的方式:

const int = 123;
for (let d of int.toString()) {
    console.log(d);
}
// 1
// 2
// 3