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.

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).


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.


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

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);).


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 .


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".


6

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

ex:

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

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 é.


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.


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));
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.