Comme le titre de mon message l'indique, j'aimerais savoir combien de chiffres a var number
. Par exemple: Si number = 15;
, ma fonction doit renvoyer 2
. Actuellement, cela ressemble à ceci:
function getlength(number) {
return number.toString().length();
}
Mais Safari dit que cela ne fonctionne pas à cause d'un TypeError
:
'2' is not a function (evaluating 'number.toString().length()')
Comme vous pouvez le constater, '2'
est en fait la bonne solution. Mais pourquoi est-ce not a function
?
length
est une propriété, pas une méthode. Vous ne pouvez pas l'appeler, vous n'avez donc pas besoin de parenthèses ()
:
function getlength(number) {
return number.toString().length;
}
UPDATE: Comme indiqué dans les commentaires, l'exemple ci-dessus ne fonctionnera pas pour les nombres flottants. Pour que cela fonctionne, nous pouvons soit supprimer un point avec String(number).replace('.', '').length
, soit compter les chiffres avec l'expression régulière: String(number).match(/\d/g).length
.
En termes de vitesse, le moyen le plus rapide d’obtenir le nombre de chiffres d’un nombre donné est de le faire mathématiquement. Pour entiers positifs , il existe un algorithme merveilleux avec log10
:
var length = Math.log(number) * Math.LOG10E + 1 | 0; // for positive integers
Pour tous les types d'entiers (y compris les négatifs), il existe une solution optimisée brillante de @ Mwr247 , mais soyez prudent avec l'utilisation de Math.log10
, car elle n'est pas prise en charge par de nombreux navigateurs existants. Donc, remplacer Math.log10(x)
par Math.log(x) * Math.LOG10E
résoudra le problème de compatibilité.
La création de solutions mathématiques rapides pour les nombres décimaux ne sera pas facile en raison de comportement bien connu des mathématiques en virgule flottante , ainsi l'approche par conversion en chaîne sera plus facile et plus sûre. Comme mentionné par @ streetlogics , la conversion rapide peut être effectuée avec une concaténation simple à une chaîne, ce qui entraîne la transformation de la solution en en:
var length = (number + '').replace('.', '').length; // for floats
Voici une réponse mathématique (fonctionne également pour les nombres négatifs):
function numDigits(x) {
return Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;
}
Et une version optimisée de ce qui précède (opérations au niveau des bits plus efficaces):
function numDigits(x) {
return (Math.log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;
}
Essentiellement, nous commençons par obtenir la valeur absolue de l'entrée pour permettre aux valeurs négatives de fonctionner correctement. Ensuite, nous exécutons l'opération log10 pour nous indiquer la puissance de l'entrée 10 (si vous travailliez dans une autre base, vous utiliseriez le logarithme de cette base), qui correspond au nombre de chiffres. Ensuite, nous rejetons la sortie pour n’en saisir que la partie entière. Enfin, nous utilisons la fonction max pour fixer les valeurs décimales (toute valeur décimale comprise entre 0 et 1 ne renvoie que 1, au lieu d’un nombre négatif) et ajoutons 1 à la sortie finale pour obtenir le nombre.
Ce qui précède suppose (en fonction de votre exemple d’entrée) que vous souhaitez compter le nombre de chiffres dans les entiers (donc 12345 = 5 et donc 12345.678 = 5 également). Si vous souhaitez compter le nombre total de chiffres dans la valeur (donc 12345.678 = 8), ajoutez-le avant le 'retour' dans l'une des fonctions ci-dessus:
x = Number(String(x).replace(/[^0-9]/g, ''));
Comme cela est apparu dans une recherche Google pour "javascript get number of digits", je tenais à préciser qu'il existe une alternative plus courte à cela qui repose sur la diffusion interne à effectuer pour vous:
var int_number = 254;
var int_length = (''+int_number).length;
var dec_number = 2.12;
var dec_length = (''+dec_number).length;
console.log(int_length, dec_length);
Les rendements
3 4
Si vous avez besoin de chiffres (après le séparateur), vous pouvez simplement fractionner le nombre et compter la seconde partie de la longueur (après le point).
function countDigits(number) {
var sp = (number + '').split('.');
if (sp[1] !== undefined) {
return sp[1].length;
} else {
return 0;
}
}
Je suis encore en train d'apprendre le javascript, mais j'ai créé cette fonction en C il y a quelque temps, qui utilise les mathématiques et une boucle while plutôt qu'une chaîne, je l'ai donc réécrite pour le Javascript. Cela pourrait peut-être être fait de manière récursive, mais je n’ai toujours pas compris le concept :( C’est le meilleur choix que je puisse faire. chiffres.
function count_digits(n) {
numDigits = 0;
integers = Math.abs(n);
while (integers > 0) {
integers = (integers - integers % 10) / 10;
numDigits++;
}
return numDigits;
}
edit: ne fonctionne qu'avec des valeurs entières
Remarque: Cette fonction ignorera les nombres situés après la moyenne décimale point , si vous voulez compter avec un nombre décimal, supprimez la Math.floor()
. Direct au point vérifier ceci!
function digitCount ( num )
{
return Math.floor( num.toString()).length;
}
digitCount(2343) ;
// ES5 +
const digitCount2 = num => String( Math.floor( Math.abs(num) ) ).length;
console.log(digitCount2(3343))
Fondamentalement Qu'est-ce qui se passe ici. toString()
et String()
même fonction intégrée pour la conversion de chiffre en chaîne. Une fois la conversion effectuée, nous trouverons la longueur de la chaîne à l'aide de la fonction intégrée length
.
Alerte: Mais cette fonction ne fonctionnerait pas correctement pour un nombre négatif, si vous essayez de jouer avec un nombre négatif alors cochez cette réponse Ou simplement mettez Math.abs()
dedans;
Vous encourager!
var i = 1;
while( ( n /= 10 ) >= 1 ){ i++ }
23432 i = 1
2343.2 i = 2
234.32 i = 3
23.432 i = 4
2.3432 i = 5
0.23432
Énoncé du problème: Nombre/chaîne de caractères n'utilisant pas string.length () jsfunction. Solution: nous pourrions le faire via le Forloop. par exemple
for (x=0; y>=1 ; y=y/=10){
x++;
}
if (x <= 10) {
this.y = this.number;
}
else{
this.number = this.y;
}
}
Deux chiffres: fonction simple au cas où vous auriez besoin de deux chiffres ou plus d'un numéro avec ECMAScript 6 (ES6):
const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;