33 votes

Comment puis-je compter les chiffres dans un entier sans conversion de chaîne?

J'ai peur il y a un simple et évident de répondre à cette question. J'ai besoin de déterminer le nombre de chiffres à l'échelle du nombre d'éléments est, afin que je puisse pad chaque numéro d'article avec le minimum de nombre de zéros nécessaires pour maintenir l'alignement. Par exemple, je veux pas de zéros si le total est < 10, 1 si c'est entre 10 et 99, etc.

Une solution serait de jeter le nombre d'éléments d'une chaîne de caractères puis de compter les caractères. Beurk! Est-il un meilleur moyen?

Edit: je n'aurais pas pensé à utiliser le logarithme décimal (je ne connaissais pas une telle chose existe). Donc, pas évident - pour moi - mais certainement simple.

51voto

Nicholas Mancuso Points 5459

Cela devrait le faire:

 int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;
 

12voto

Ryan Emerle Points 8073
 int length = (int)Math.Log10(Math.Abs(number)) + 1;
 

Vous devrez peut-être rendre compte du signe négatif.

12voto

jheriko Points 2326

Une solution plus efficace qu'une division répétée serait répétée si les instructions avec des multiplications ... par exemple (où n est le nombre dont le nombre de chiffres est requis)

 unsigned int test = 1;
unsigned int digits = 0;
while (n >= test)
{
  ++digits;
  test *= 10;
}
 

S'il existe une limite supérieure raisonnable sur le nombre d'éléments (par exemple, la plage de 32 bits d'un unsigned int), une méthode encore meilleure consiste à comparer avec les membres d'un tableau statique, par exemple

 // this covers the whole range of 32-bit unsigned values
const unsigned int test[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };

unsigned int digits = 10;
while(n < test[digits]) --digits;
 

4voto

Greg Hewgill Points 356191

Vous pouvez utiliser une boucle while, qui sera probablement plus rapide qu'un logarithme, car elle utilise uniquement l'arithmétique entière:

 int len = 0;
while (n > 0) {
    len++;
    n /= 10;
}
 

Je laisse au lecteur le soin de régler cet algorithme pour gérer les nombres zéro et négatifs.

4voto

cjk Points 27463

Si vous voulez composer le numéro en .Net, alors

 num.ToString().PadLeft(10, '0')
 

pourrait faire ce que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X