Domanda
Sto cercando di trovare un buon modo per stampare i primi 0, come 01001 per un codice postale. Mentre il numero verrebbe memorizzato come 1001, qual è un buon modo per farlo?
Ho pensato di usare entrambe le dichiarazioni case / if per capire quante cifre è il numero e quindi convertirlo in un array di caratteri con 0 aggiuntivi per la stampa, ma non posso fare a meno di pensare che potrebbe esserci un modo per farlo questo con la sintassi del formato printf che mi sfugge.
Soluzione
printf("%05d", zipCode);
Altri suggerimenti
La soluzione corretta è archiviare il codice postale nel database come STRING. Nonostante possa sembrare un numero, non lo è. È un codice, in cui ogni parte ha un significato.
Un numero è una cosa su cui fai l'aritmetica. Un codice postale non è quello.
Metti uno zero prima della larghezza minima del campo:
printf("%05d",zipcode);
Il codice postale è un campo altamente localizzato, molti paesi hanno caratteri nei loro codici postali, ad esempio Regno Unito, Canada. Pertanto, in questo esempio, è necessario utilizzare un campo stringa / varchar per memorizzarlo se in qualsiasi momento si spedire o ottenere utenti / clienti / clienti / ecc. Da altri paesi.
Tuttavia, nel caso generale, è necessario utilizzare la risposta consigliata ( printf ("% 05d " ;, numero);
).
Se sei su un * NIX Machine:
man 3 printf
Questo mostrerà una pagina di manuale, simile a:
0 Il valore deve essere zero imbottito. Per d, i, o, u, x, X, a, A, e, Conversioni E, f, F, ge G, il valore convertito viene riempito la sinistra con zeri anziché spazi vuoti. Se i flag 0 e - entrambi appaiono, il flag 0 viene ignorato. Se viene data una precisione con una conversione numerica (d, i, o, u, xe X), il flag 0 è ignorato. Per altre conversioni, il comportamento non è definito.
Anche se la domanda è per C, questa pagina può essere di aiuto.
sprintf(mystring, "%05d", myInt);
Qui, " 05 " dice "utilizzare 5 cifre con zeri iniziali".
printf consente varie opzioni di formattazione.
es:
printf("leading zeros %05d", 123);
Ti risparmierai un mucchio di problemi (a lungo termine) se memorizzi un codice postale come stringa di caratteri, che è, piuttosto che un numero, che non lo è.
Più flessibile .. Ecco un esempio di stampa di righe di numeri giustificati a destra con larghezze fisse e spaziatura.
//---- 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
La funzione e la macro sono progettate in modo che i file di stampa siano più leggibili.
Se è necessario memorizzare il codice postale in un codice postale dell'array di caratteri [], è possibile utilizzare questo:
snprintf( zipcode, 6, "%05.5d", atoi(zipcode));