Imprimir 0 principais em C?

344

Estou tentando encontrar uma boa maneira de imprimir os 0s iniciais, como 01001, para um CEP. Embora o número seja armazenado como 1001, qual é uma boa maneira de fazer isso?

Eu pensei em usar as instruções de caso / se, então, descobrir quantos dígitos o número tem e depois convertê-lo em uma matriz de caracteres com 0 extra para impressão, mas não posso deixar de pensar que pode haver uma maneira de fazer isso com o sintaxe do formato printf que está me iludindo.

zxcv
fonte

Respostas:

567
printf("%05d", zipCode);

O 0indica com o que você está preenchendo e 5mostra o comprimento do número inteiro. Por exemplo, se você usar "%02d"(Útil para datas), isso preencheria apenas zeros para números na coluna unidades (por exemplo, em 06vez de 6). O exemplo 2 "%03d"preencheria 2 zeros para um número na coluna unidades e preenchia 1 zero para um número na coluna dezenas. ie (número 7 preenchido 007e número 17 preenchido 017).

EvilTeach
fonte
237
Por favor, não guarde códigos postais como números. Alguns países têm letras no CEP.
Sec
11
Para o seu caso, isso seria suficiente. Como alguém pode ter zeros à esquerda em um número inteiro de comprimento desconhecido?
Dominic Motuka
Você precisa saber o comprimento máximo da corda final acolchoada. Como alternativa, se você sempre quis 5 zeros à esquerda, "00000" + inteiro.to_s. etc
mlambie 04/03
160

A solução correta é armazenar o CEP no banco de dados como uma STRING. Apesar de parecer um número, não é. É um código, onde cada parte tem significado.

Um número é algo em que você faz aritmética. Um código postal não é isso.

James Curran
fonte
32
Ya. Sua observação está absolutamente correta. É isso que eu faço. No entanto, a pessoa que está fazendo a pergunta provavelmente está tentando lidar com a lição de casa, em vez do código de produção. A resposta precisa ser adaptada à pessoa que faz a pergunta.
EvilTeach
15
Suponho que deveria tê-lo reformulado mais precisamente para ilustrar que estava procurando ver como posso fazer personagens principais e finais em um idioma que eu não conhecia. Terei mais cuidado com exemplos arbitrários no futuro!
Zxcv
3
Outros países, como o Reino Unido ter letras em códigos postais
jjxtra
47

Você coloca um zero antes da largura mínima do campo:

printf("%05d",zipcode);
Adam Bellaire
fonte
16

O CEP é um campo altamente localizado, muitos países têm caracteres em seus códigos postais, por exemplo, Reino Unido, Canadá. Portanto, neste exemplo, você deve usar um campo string / varchar para armazená-lo, a qualquer momento enviando ou recebendo usuários / clientes / clientes / etc de outros países.

No entanto, no caso geral, você deve usar a resposta recomendada ( printf("%05d", number);).

JeeBee
fonte
16

Se você estiver em uma máquina * NIX:

man 3 printf

Isso mostrará uma página de manual, semelhante a:

0 O valor deve ser preenchido com zero. Para conversões d, i, o, u, x, X, a, A, e, E, f, F, ge G, o valor convertido é preenchido à esquerda com zeros em vez de espaços em branco. Se os sinalizadores 0 e - aparecerem, o sinalizador 0 será ignorado. Se uma precisão é fornecida com uma conversão numérica (d, i, o, u, x e X), o sinalizador 0 é ignorado. Para outras conversões, o comportamento é indefinido.

Mesmo que a pergunta seja para C, esta página pode ser útil .

Paul Tomblin
fonte
11
por que o número 3 é necessário?
22418 eri0o
4
@ Elric Se você der um argumento numérico ao mancomando, ele será restrito a essa seção específica. Sem ele, você obterá a página de manual do comando shell, em printfvez da função C.
Paul Tomblin
14
sprintf(mystring, "%05d", myInt);

Aqui, "05" diz "use 5 dígitos com zeros à esquerda".

Dan Hewett
fonte
6

printf permite várias opções de formatação.

ex:

printf("leading zeros %05d", 123);
Trent
fonte
3

Você economizará um monte de problemas (a longo prazo) se armazenar um CEP como uma sequência de caracteres, que é, em vez de um número, que não é.

pro3carp3
fonte
Se alguém explicasse como zerar um array de caracteres. Existe até uma solução que usa atoi () para transformar a matriz de caracteres em um init e, em seguida, use% 05d. Espero que essa não seja a única solução.
Niko
0

Mais flexível. Veja um exemplo de impressão de linhas de números justificados à direita com larguras fixas e preenchimento de espaço.

//---- Header
std::string getFmt ( int wid, long val )
{  
  char buf[64];
  sprintf ( buf, "% *ld", wid, val );
  return buf;
}
#define FMT (getFmt(8,x).c_str())

//---- Put to use
printf ( "      COUNT     USED     FREE\n" );
printf ( "A: %s %s %s\n", FMT(C[0]), FMT(U[0]), FMT(F[0]) );
printf ( "B: %s %s %s\n", FMT(C[1]), FMT(U[1]), FMT(F[1]) );
printf ( "C: %s %s %s\n", FMT(C[2]), FMT(U[2]), FMT(F[2]) );

//-------- Output
      COUNT     USED     FREE
A:      354   148523     3283
B: 54138259 12392759   200391
C:    91239     3281    61423

A função e a macro são projetadas para que os printfs sejam mais legíveis.

rch
fonte
4
Não tenho 100% de certeza de sua intenção com a macro, mas parece que você pretende definir uma função, como #define FMT(x) (getFmt(8,x).c_str())(observe o parâmetro x !), Em oposição a uma variável (que é o que seu código faz).
Ponkadoodle
0

Se você precisar armazenar o CEP em um CEP de matriz de caracteres [], poderá usar o seguinte:

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
Brad Jennings
fonte