web-dev-qa-db-fra.com

JavaScript Number Divisé en chiffres individuels

Bonjour, j'essaie de résoudre un problème de maths où je prends un nombre, par exemple. 45 ou 111, puis divisez le nombre en chiffres séparés, par ex. 4 5 ou 1 1 1. Je vais ensuite enregistrer chaque nombre dans une variable sur laquelle exécuter une méthode. Quelqu'un ne sait-il pas comment fractionner un nombre en chiffres individuels? 

Par exemple, j'ai une boucle qui s'exécute sur un tableau: 

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

Pour chaque numéro, j'aimerais fractionner ses chiffres et les additionner?

42
jonnyhitek
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]
 */ 

UPDATE: Calculer une somme

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

/*
 * Outputs: 39
 */
46
Lapple

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

63
Brian Glaz

Vous pouvez également le faire de manière "mathématique" sans traiter le nombre comme une chaîne:

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

Je peux constater un avantage: vous n'avez pas besoin d'exécuter parseInt() sur chaque chiffre, vous traitez avec les chiffres réels sous forme de valeurs numériques.

Cas de test en direct .

17
Shadow Wizard

Je vais fournir une variante d'une réponse déjà donnée pour que vous puissiez voir une approche différente qui conserve le type numérique tout au long:

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

J'ai utilisé à bon escient une technique telle que celle décrite ci-dessus lors de la conversion d'un nombre en chiffres romains, ce qui est l'une de mes méthodes préférées pour apprendre un langage de programmation que je ne connais pas bien. Voici comment j'ai conçu un moyen de convertir des nombres en chiffres romains avec Tcl il y a 10 ans: http://code.activestate.com/recipes/68379-conversion-to-roman-numerals/

Les lignes comparables dans mon script Tcl étant:

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

C'est le plus court que j'ai trouvé, même s'il renvoie les chiffres sous forme de chaînes:

let num = 12345;

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

Ou utilisez ceci pour récupérer des entiers:

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

Pour cela, vous pouvez travailler sur des chaînes plutôt que sur des chiffres. Tu peux le faire comme ça 

(111 + '').split('')

Cela renverra un tableau de chaînes ['1','1','1'] sur lequel vous pourrez effectuer une itération et appeler la méthode parseInt.

parseInt('1') === 1

Si vous voulez la somme de chiffres individuels, vous pouvez utiliser la fonction de réduction (implémentée à partir de Javascript 1.8) comme ceci

(111 + '').split('').reduce(function(previousValue, currentValue){  
  return parseInt(previousValue,10) + parseInt(currentValue,10);  
})
4
Narendra Yadala

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

3
le_m

Une introduction amusante à la récursivité. Cette réponse prend un nombre et retourne un tableau de chiffres. Not ne convertit pas le nombre en chaîne en tant qu'étape intermédiaire.

Étant donné n = 1234,

  • n % 10 retournera le premier chiffre (droite-humide), 4
  • n / 10 retournera 123 avec du reste
  • En utilisant Math.floor, nous pouvons couper le reste
  • En répétant ces étapes, nous pouvons former le résultat entier

Maintenant, il ne reste plus qu'à construire la condition de récursivité,

  • Si le nombre est déjà un seul chiffre (n <10), retourne un singleton de tableau du chiffre
  • sinon (inductif), le nombre est supérieur ou égal à 10; se reproduire et ajouter au premier chiffre

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 ]

2
user633183

Shadow Wizard, version étendue par 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);

sortie: 1000,500,20,3

1
Orien

Sans convertir en chaîne:

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

Séparez chaque 2 paramètres. 

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
1
fdrv

Avec ES6, vous pouvez utiliser Array.from avec un nombre chaîné comme iterables et Number comme fonction de mappage.

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

console.log(getDigits(12345));

1
Nina Scholz

Une approche fonctionnelle pour obtenir les chiffres d'une number serait d'obtenir une string de votre number, de la scinder en une array (de caractères) et de mapper chaque élément en un nombre.

Par exemple:

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]

Si vous devez également additionner tous les chiffres, vous pouvez ajouter la méthode reduce() au code précédent:

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

Alternativement, avec ECMAScript 2015 (6ème édition), vous pouvez utiliser les fonctions de flèche :

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

Si vous devez additionner tous les chiffres, vous pouvez ajouter la méthode reduce() au code précédent:

var num = 123456;

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

console.log(result); // returns 21
0
Imanou Petit

Vous pouvez essayer ça.

  var num = 99;

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

J'espère que cela a aidé!

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

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

J'ai utilisé cette façon simple de le faire.

Pour fractionner les chiffres

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

Pour les ajouter ensemble

console.log(arr.reduce( (a,b) => a+b )); // 15
0
makk_bit
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
    }
}
0
user2584621