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?
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
*/
var num = 123456;
var digits = num.toString().split('');
var realDigits = digits.map(Number)
console.log(realDigits);
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.
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}]
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]
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);
})
// 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]
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 resteMath.floor
, nous pouvons couper le resteMaintenant, il ne reste plus qu'à construire la condition de récursivité,
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 ]
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
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;
}
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
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));
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
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é!
var num = 111,
separateDigits = num.toString().split(""), i, l = separateDigits.length;
for( i = 0; i < l; ++i ) {
someObject.someMethod( +separateDigits[i] );
}
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
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
}
}