Obtenez le nombre de chiffres avec JavaScript

124

Comme le titre de mon article l'indique, j'aimerais savoir combien de chiffres var numberont. Par exemple: si number = 15;ma fonction doit retourner 2. Actuellement, cela ressemble à ceci:

function getlength(number) {
  return number.toString().length();
}

Mais Safari dit que cela ne fonctionne pas en raison d'un TypeError:

'2' is not a function (evaluating 'number.toString().length()')

Comme vous pouvez le voir, '2'c'est en fait la bonne solution. Mais pourquoi est-ce not a function?

bit4fox
la source

Réponses:

229

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

MISE À JOUR: Comme indiqué dans les commentaires, l'exemple ci-dessus ne fonctionnera pas pour les nombres flottants. Pour le faire fonctionner , nous pouvons soit se débarrasser d'une période avec String(number).replace('.', '').length, ou compter les chiffres avec une 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 dans le nombre donné est de le faire mathématiquement. Pour les entiers positifs, il existe un merveilleux algorithme 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 excellente solution optimisée de @ Mwr247 , mais soyez prudent avec l'utilisation Math.log10, car elle n'est pas prise en charge par de nombreux navigateurs hérités. Le remplacement Math.log10(x)par Math.log(x) * Math.LOG10Erésoudra donc le problème de compatibilité.

La création de solutions mathématiques rapides pour les nombres décimaux ne sera pas facile en raison du comportement bien connu des mathématiques en virgule flottante , donc l'approche de conversion en chaîne sera plus facile et infaillible. Comme mentionné par @streetlogics, le casting rapide peut être effectué avec une simple concaténation de nombre en chaîne, ce qui conduit la solution de remplacement à être transformée en:

var length = (number + '').replace('.', '').length;  // for floats
Vision
la source
3
bonne technique pour obtenir aucun de chiffre, mais, que se passe-t-il si c'est un nombre fractionnaire, c'est-à-dire 12,5, alors votre fonction renverra 4 au lieu de 3 ...
Swarnendu Paul
@Swarnendu: Ce n'est pas un problème car je n'ai que des entiers.
bit4fox
3
Sinon, utilisez simplement quelque chose comme number.toString().match(/\d/g).length.
VisioN
1
@Bakudan - Cette réponse semble avoir été corrigée. Vous pouvez supprimer vos deux commentaires en le critiquant maintenant (pour que les futures personnes ne se
trompent
1
@ 3ocène Bonne supposition! La valeur reste la même mais derrière la scène, elle est convertie en entier. x | 0est juste une autre version courte et rapide de Math.floor(x), qui arrondit le nombre à la baisse. Vous pouvez réaliser la même chose avec ~~x. La question suivante fournit plus d'explications sur ce point: stackoverflow.com/q/9049677/1249581 .
VisioN
66

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 du bit 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 via log10 pour nous donner la puissance de 10 de l'entrée (si vous travailliez dans une autre base, vous utiliseriez le logarithme pour cette base), qui est le nombre de chiffres. Ensuite, nous plancher la sortie pour saisir uniquement la partie entière de celle-ci. Enfin, nous utilisons la fonction max pour fixer les valeurs décimales (toute valeur fractionnaire entre 0 et 1 renvoie simplement 1, au lieu d'un nombre négatif), et ajoutons 1 à la sortie finale pour obtenir le nombre.

Ce qui précède suppose (basé sur votre exemple d'entrée) que vous souhaitez compter le nombre de chiffres en nombres 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, ''));
Mwr247
la source
3
Remarque: Math.log10 est développeur de
ES6.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
2
@ Tx3 Bonne note! Heureusement, Math.LOG10Eexiste depuis ES1, ce qui signifie que Math.log(x) * Math.LOG10Ecela fonctionnera pour la compatibilité.
Mwr247
Je pense que cette fonction ne fonctionne pas: `` function numDigits (x) {return (Math.log10 ((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; } `` `numDigits (1234567891) -> 10 numDigits (12345678912) -> 9
lokhmakov
@lokhmakov C'est parce que le deuxième nombre que vous avez donné dépasse la valeur entière maximale de 32 bits de JavaScript, que les opérateurs au niveau du bit (^, >>, |) ne peuvent pas gérer correctement.
Mwr247
1
Vrai. Il faut s'attendre à ce que JS ne fonctionne qu'avec le max safe int, et ce nombre est beaucoup plus grand que ce que presque n'importe qui aurait besoin pour quoi que ce soit. Je développe un jeu avec de très grands nombres et je ne pouvais pas utiliser le code optimisé à cause de cette limitation, et j'ai pensé que je ferais un commentaire pour éviter à quiconque dans un bateau similaire d'avoir un code cassé plus tard. Excellente réponse au fait.
Justin
20

Depuis que cela est venu sur une recherche Google pour "javascript obtenir le nombre de chiffres", je voulais dire qu'il existe une alternative plus courte à cela qui repose sur la diffusion interne à faire 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);

Rendements

3 4
streetlogics
la source
4
Et un rapide jsperf montre que c'est BEAUCOUP plus rapide (comme dans, 10x ou plus): jsperf.com/number-tostring-vs-number
Ledivin
REMARQUE! Compte également le point comme un nombre. (en déc_number)
Sebastian Norr
2

Si vous avez besoin de chiffres (après le séparateur), vous pouvez simplement diviser le nombre et compter la deuxième 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;
    }
}
Maciej Maciej
la source
2

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

utilisateur40521
la source
1

J'apprends encore en quelque sorte Javascript, mais j'ai inventé cette fonction en C il y a quelque temps, qui utilise les mathématiques et une boucle while plutôt qu'une chaîne, alors je l'ai réécrite pour Javascript. Peut-être que cela pourrait être fait récursivement d'une manière ou d'une autre, mais je n'ai toujours pas vraiment compris le concept: (C'est le meilleur que j'ai pu trouver. Je ne suis pas sûr de la quantité de nombres avec lesquels cela fonctionne, cela a fonctionné quand j'ai mis une centaine 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

Nate
la source
1

Remarque: Cette fonction ignorera les nombres après le point moyen décimal.Si vous voulez compter avec décimal, supprimez le Math.floor(). Directement au point, vérifiez 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))

En gros, ce qui se passe ici. toString()et String()même fonction intégrée pour la conversion de chiffre en chaîne, une fois que nous avons converti, nous trouverons la longueur de la chaîne par 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, vérifiez cette réponse Ou mettez-y simplement Math.abs();

Bravo!

Code
la source
1
`You can do it by simple loop using Math.trunc() function. if in interview interviewer ask to do it without converting it into string`
    let num = 555194154234 ;
    let len = 0 ;
    const numLen = (num) => {
     for(let i = 0; i < num ||  num == 1 ; i++){
        num = Math.trunc(num/10);
        len++ ;
     }
      return len + 1 ;
    }
    console.log(numLen(num));
Rajat Srivastava
la source
0

Deux chiffres: fonction simple au cas où vous auriez besoin de deux chiffres ou plus d'un nombre avec ECMAScript 6 (ES6):

const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;
Rafael Melón
la source
0

Énoncé du problème: nombre / chaîne de comptage n'utilisant pas la fonction js string.length () . 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;
}    

}

Yogesh Aggarwal
la source
0

Voici ma solution. Cela fonctionne avec des nombres positifs et négatifs. J'espère que cela t'aides

function findDigitAmount(num) {

   var positiveNumber = Math.sign(num) * num;
   var lengthNumber = positiveNumber.toString();

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4
Juliana Melo
la source
0

il serait simple d'obtenir la longueur comme

  `${NUM}`.length

où NUM est le nombre pour obtenir la longueur

AP
la source
0

Vous pouvez utiliser dans cette astuce

(''+number).length

Idan
la source
0

Veuillez utiliser l'expression suivante pour obtenir la longueur du nombre.

length = variableName.toString().length
Priya Shalini
la source
-7

La propriété length renvoie la longueur d'une chaîne (nombre de caractères).

La longueur d'une chaîne vide est de 0.

var str = "Hello World!";
var n = str.length;

Le résultat de n sera: 12

    var str = "";
    var n = str.length;

Le résultat de n sera: 0


Propriété de la longueur du tableau:


La propriété length définit ou renvoie le nombre d'éléments dans un tableau.

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.length;

Le résultat sera: 4

Syntaxe:

Renvoie la longueur d'un tableau:

array.length

Définissez la longueur d'un tableau:

array.length=number
Muhammad Awais
la source
2
Cela ne répond pas à la question
Steve Taylor