【问题标题】:JavaScript Number Split into individual digitsJavaScript Number 拆分为单个数字
【发布时间】:2011-12-08 17:39:30
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript math


    【解决方案1】:
    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,对我来说工作得很快 — i.imgur.com/TTGZL.png — Chrome 14 @ Win7。还有一个 jsfiddle:jsfiddle.net/Lapple/ZmS3B
    • 可能您的浏览器不支持console API — 将console 更改为alert
    • 不,我认为这是我的错误,我试图在我的循环中运行你的代码 -
    【解决方案2】:
    var num = 111,
     separateDigits = num.toString().split(""), i, l = separateDigits.length;
    
    for( i = 0; i < l; ++i ) {
    someObject.someMethod( +separateDigits[i] );
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 添加 var realDigits = digits.map(Number) 我们达成交易
      • "555".split('').map(Number)
      【解决方案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);  
      })
      

      【讨论】:

        【解决方案5】:

        你也可以用“数学”的方式来做,而不把数字当作一个字符串:

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 很遗憾,第一次正确使用 % 运算符在答案列表中如此之低
          • 感谢您的持续支持,但鉴于 ES5 和/或 ES6,这个答案几乎不再有效。即使是这样,我也应该指定output.unshift(而不是push),从而使reverse()变得不必要——很多人都没有想到unshift
          • @GeorgeJempty,感谢您强调保留数字类型。昨天我花了太多时间来解决由字符串输入引起的基本转换问题。我将不胜感激您可能与 ES5/ES6 和/或 output.unshift 相关的此答案的任何更新。
          【解决方案7】:

          分离每个 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
          

          【讨论】:

            【解决方案8】:

            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

            【讨论】:

              【解决方案9】:

              为了从number 获取数字的功能方法是从number 获取string,将其拆分为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
              

              【讨论】:

                【解决方案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]

                【讨论】:

                  【解决方案11】:

                  你可以试试这个。

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

                  希望这有帮助!

                  【讨论】:

                    【解决方案12】:

                    我使用了这种简单的方法。

                    拆分数字

                    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
                    

                    【讨论】:

                      【解决方案13】:

                      这是我找到的最短的,虽然它确实将数字作为字符串返回:

                      let num = 12345;
                      
                      [...num+''] //["1", "2", "3", "4", "5"]
                      

                      或者用它来取回整数:

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

                      【讨论】:

                        【解决方案14】:
                        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
                            }
                        }
                        

                        【讨论】:

                        • 你应该解释你的答案。目前,这只是一段代码,不包含任何 cmets 或对尝试学习该概念的人的帮助。
                        【解决方案15】:

                        不转换为字符串:

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

                        【讨论】:

                          【解决方案16】:

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

                          试试下面:

                          console.log((''+123).split('').map(Number))

                          【讨论】:

                            【解决方案17】:

                            在 ES6 中,您可以使用 Array.from 和字符串数字 iterablesNumber 作为映射函数。

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

                            【讨论】:

                              【解决方案18】:

                              为了将一个整数以相同的顺序拆分为各个数字,我使用正则表达式并且更喜欢使用正则表达式,因为它可以防止丢失数字标识的机会,即使它们已被转换为字符串。

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

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

                              【讨论】:

                                【解决方案19】:

                                ('' + 123456789).split('').map( x =&gt; +x ).reduce( (a,b) =&gt; a+b ) === 45

                                是的

                                或者没有地图

                                ('' + 123456789).split('').reduce( (a,b) =&gt; (+a)+(+b) ) === 45

                                是的

                                【讨论】:

                                • 最初的问题是关于拆分数字并将它们加在一起
                                【解决方案20】:

                                递归的有趣介绍。这个答案接受一个 Number 并返回一个 Number 数字的数组。它确实将数字转换为字符串作为中间步骤。

                                给定n = 1234

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

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

                                • 如果数字已经是单个数字(n
                                • 否则(感应)数字为 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 ]

                                【讨论】:

                                • 这确实很简洁,但似乎并非在所有情况下都有效。 digits(123456789012) 返回[-539222987, 2]
                                • @Wondercricket 感谢您发现它,我进行了更新以修复它。这是&gt;&gt; 的行为,我不太明白。不知道是不是bug?
                                • 题外话:期待在stackoverflow.com/q/54721972/5260024上看到你的回答:)
                                • 很酷的问题,嗯?感谢分享。看起来 B 已经发现了这个问题:D
                                【解决方案21】:

                                您可以在一行中完成,将每个数字分开而不是将它们加在一起:

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

                                【讨论】:

                                  【解决方案22】:

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

                                      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】:

                                    javascript有一个功能,你可以轻松使用它。

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

                                    例如:

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

                                    【讨论】:

                                      【解决方案24】:

                                      这也有效:

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

                                      【讨论】:

                                        【解决方案25】:

                                        我可能是错的,但解决方案是零碎的。也许,正如我仍在学习的那样,这些函数在同一个函数中做了很多事情。请不要犹豫,纠正我。

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

                                        如果负数或纯零作为参数下降。祝我们大家编码愉快。

                                        【讨论】:

                                          【解决方案26】:

                                          使用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);

                                          【讨论】:

                                            【解决方案27】:

                                            我发布此答案是为了介绍现代解决方案 unshift 的使用。使用push,您添加到数组的末尾,而 unshift 则添加到开头。这使得数学方法更加强大,因为您不再需要逆向。

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

                                            【讨论】:

                                              【解决方案28】:

                                              使用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));

                                              【讨论】:

                                                【解决方案29】:

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

                                                【讨论】:

                                                  猜你喜欢
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 2017-05-23
                                                  • 1970-01-01
                                                  相关资源
                                                  最近更新 更多