zero pad - with - ¿Cómo puedo contar los dígitos en un entero sin un molde de cuerda?
java string fill with blanks (10)
Como un número no tiene ceros a la izquierda, está convirtiendo de todos modos para agregarlos. No estoy seguro de por qué estás tan esforzándote por evitarlo para encontrar la longitud en la que el resultado final tendrá que ser una cadena de todos modos.
Me temo que hay una respuesta simple y obvia a esta pregunta. Necesito determinar cuántos dígitos tiene un conteo de elementos, de modo que pueda rellenar cada número de artículo con la cantidad mínima de ceros iniciales necesarios para mantener la alineación. Por ejemplo, no quiero ceros a la izquierda si el total es <10, 1 si está entre 10 y 99, etc.
Una solución sería convertir el recuento de elementos en una cadena y luego contar los caracteres. ¡Yuck! ¿Hay una mejor manera?
Editar: No hubiera pensado usar el logaritmo común (no sabía que existiera tal cosa). Entonces, no es obvio, para mí, pero definitivamente simple.
De acuerdo, no me puedo resistir: use /=
:
#include <stdio.h>
int
main(){
int num = 423;
int count = 1;
while( num /= 10)
count ++;
printf("Count: %d/n", count);
return 0;
}
534 $ gcc count.c && ./a.out
Count: 3
535 $
Hubiera publicado un comentario, pero mi puntaje de representante no me otorgará esa distinción.
Todo lo que quería señalar es que a pesar de que el Log (10) es una solución muy elegante (léase: muy pocas líneas de código), es probablemente la que más grava al procesador.
Creo que la respuesta de Jherico es probablemente la solución más eficiente y, por lo tanto, debería ser recompensada como tal.
Especialmente si vas a hacer esto para muchos números ...
Puede recorrer y eliminar por 10, contar el número de veces que realiza un ciclo;
int num = 423;
int minimum = 1;
while (num > 10) {
num = num/10;
minimum++;
}
Puede usar un ciclo while, que probablemente sea más rápido que un logaritmo porque solo usa aritmética de números enteros:
int len = 0;
while (n > 0) {
len++;
n /= 10;
}
Lo dejo como ejercicio para que el lector ajuste este algoritmo para manejar números cero y negativos.
Si va a rellenar el número en .Net, entonces
num.ToString().PadLeft(10, ''0'')
podría hacer lo que quieras
Una solución es provista por el logaritmo de la base 10, un exceso excesivo.
int length = (int)Math.Log10(Math.Abs(number)) + 1;
Es posible que necesites contabilizar el signo negativo.
Esto debería hacerlo:
int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;
Una solución más eficiente que la división repetida se repetiría si las declaraciones con multiplicaciones ... ej. (Donde n es el número cuyo número de dígitos se requiere)
unsigned int test = 1;
unsigned int digits = 0;
while (n >= test)
{
++digits;
test *= 10;
}
Si hay algún límite superior razonable en el recuento de elementos (por ejemplo, el rango de 32 bits de una int sin firmar), una forma aún mejor es comparar con los miembros de una matriz estática, por ejemplo
// 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;