Pergunta

Eu temo que há um simples e resposta óbvia a esta pergunta. Eu preciso determinar quantos dígitos ampla uma contagem de itens é, para que eu possa pad cada número de item com o mínimo número de zeros à esquerda necessário para manter o alinhamento. Por exemplo, eu quero que há zeros à esquerda se o total for <10, 1 se for entre 10 e 99, etc.

Uma solução seria para lançar a contagem de item para uma string e, em seguida, contar caracteres. Que nojo! Existe uma maneira melhor?

Edit: eu não teria pensado em usar a comum logaritmo (eu não sabia tal coisa um existia). Então, não é óbvio - para mim -. Mas definitivamente simples

Foi útil?

Solução

Isso deve fazê-lo:

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

Outras dicas

int length = (int)Math.Log10(Math.Abs(number)) + 1;

Você pode precisar de conta para o sinal negativo ..

Uma solução mais eficiente do que a divisão repetida iria ser repetido se declarações com multiplica ... por exemplo, (Em que n é o número é necessário cujo número de dígitos)

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

Se houver algum razoável limite superior na contagem de item (por exemplo, o alcance de um int não assinado de 32-bit), em seguida, uma maneira ainda melhor é comparar com membros de alguma matriz estática, por exemplo.

// 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;

Se você estiver indo para preencher o número na Net, em seguida,

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

pode fazer o que quiser.

Você pode usar um loop while, que provavelmente será mais rápido do que um logaritmo, porque isso usa inteiros aritmética apenas:

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

Eu deixá-lo como um exercício para o leitor para ajustar este algoritmo para lidar com zero e os números negativos.

Eu teria postou um comentário, mas a minha pontuação representante não vai me conceder essa distinção.

Tudo que eu queria salientar é que, embora o Log (10) é um muito elegante. (Leia-se muito poucas linhas de código) solução, é provavelmente o mais desgastante para o processador

Eu acho que a resposta de Jherico é provavelmente a solução mais eficiente e, portanto, deve ser recompensado como tal.

Especialmente se você estiver indo para estar fazendo isso para um monte de números ..

Uma vez que um número não tem zeros à esquerda, você está convertendo qualquer maneira para adicioná-los. Eu não tenho certeza por que você está se esforçando para evitá-lo para encontrar o comprimento quando o resultado final terá que ser uma string de qualquer maneira.

Uma solução é fornecida por logaritmo de base 10, um pouco exagerado.

Você pode percorrer e excluir em 10, contar o número de vezes que você laço;

int num = 423;
int minimum = 1;
while (num > 10) {
    num = num/10;
    minimum++;
}

Ok, eu não posso resistir: uso /=:

#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 $ 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top