Stampa 0 iniziali in C?


345

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 utilizzare 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 con il sintassi del formato printf che mi sfugge.

Risposte:


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

Il 0indica cosa stai riempiendo e 5mostra la lunghezza del numero intero. Ad esempio, se si utilizza "%02d"(Utile per le date), questo riempirebbe solo gli zeri per i numeri nella colonna di quelli, ovvero ( 06anziché 6). Esempio 2, "%03d"pad 2 zeri per un numero nella colonna one e pad 1 zero per un numero nella colonna decine. vale a dire. (numero 7 imbottito a 007e numero 17 imbottito a 017).


238
Si prega di non memorizzare i codici postali come numeri. Alcuni paesi hanno lettere nel loro codice postale.
Sec

1
Per il tuo caso, questo sarebbe sufficiente. Come si possono avere zero iniziali in un numero intero di lunghezza sconosciuta?
Dominic Motuka,

Devi conoscere la lunghezza massima della stringa imbottita finale. In alternativa, se hai sempre desiderato 5 zeri iniziali, allora "00000" + integer.to_s. etc
mlambie

160

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.


32
Ya. La tua osservazione è assolutamente corretta. Questo è quello che faccio. Tuttavia, la persona che sta ponendo la domanda sta probabilmente cercando di occuparsi dei compiti, anziché del codice di produzione. La risposta deve essere adattata alla persona che pone la domanda.
EvilTeach

15
Suppongo che avrei dovuto riformularlo più precisamente per illustrare che stavo cercando di vedere come posso fare i personaggi principali e finali in una lingua che non conoscevo. Starò più attento con esempi arbitrari in futuro!
zxcv,

3
Altri paesi, come il Regno Unito, hanno lettere in codice postale
jjxtra,

47

Metti uno zero prima della larghezza minima del campo:

printf("%05d",zipcode);

16

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", number);).


16

Se sei su una macchina * NIX:

man 3 printf

Questo mostrerà una pagina di manuale, simile a:

0 Il valore deve essere zero imbottito. Per le conversioni d, i, o, u, x, X, a, A, e, E, f, F, g, e G, il valore convertito viene riempito a sinistra con zeri anziché con spazi vuoti. Se vengono visualizzati entrambi i flag 0 e -, il flag 0 viene ignorato. Se viene data una precisione con una conversione numerica (d, i, o, u, x e X), il flag 0 viene ignorato. Per altre conversioni, il comportamento non è definito.

Anche se la domanda è per C, questa pagina può essere di aiuto.


1
perché è necessario il numero 3?
eri0o

4
@Elric Se dai un argomento numerico al mancomando, lo restringe a quella particolare sezione. Senza di essa, otterrai la pagina man per il comando shell printfinvece della funzione C.
Paul Tomblin,

14
sprintf(mystring, "%05d", myInt);

Qui "05" dice "usa 5 cifre con zeri iniziali".


6

printf consente varie opzioni di formattazione.

ex:

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

3

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


Se solo qualcuno spiegasse come azzerare un array di caratteri. Esiste persino una soluzione che utilizza atoi () per trasformare l'array char in un init e quindi usare% 05d. Spero che questa non sia l'unica soluzione.
Niko,

0

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.


4
Non sono sicuro al 100% delle tue intenzioni con la macro, ma sembra che tu abbia voluto definire una funzione, come #define FMT(x) (getFmt(8,x).c_str())(nota il parametro x !), Al contrario di una variabile (che è ciò che fa il tuo codice).
Ponkadoodle,

0

Se è necessario memorizzare il codice postale in un codice postale dell'array di caratteri [], è possibile utilizzare questo:

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.