2008-09-30 3 views
236

Ich versuche, eine gute Möglichkeit zu finden, führende Nullen zu drucken, z. B. 01001 für eine Postleitzahl. Während die Nummer als 1001 gespeichert wird, was ist ein guter Weg, dies zu tun?Führende Nullen in C?

Ich dachte, entweder case statements/wenn dann herauszufinden, wie viele Ziffern die Zahl ist und dann konvertieren es in ein Char-Array mit extra 0 für das Drucken, aber ich kann nicht helfen, aber es könnte ein Weg zu sein tue dies mit der printf-Format-Syntax, die mir entgeht.

Antwort

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

+161

Bitte speichern nicht zipcodes als Zahlen. Einige Länder haben Buchstaben in ihrer Postleitzahl. – Sec

7

printf verschiedene Formatierungsoptionen ermöglicht.

ex:

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

Sie eine Null vor der minimalen Feldbreite platzieren:

printf("%05d",zipcode); 
14

Wenn Sie auf einer * NIX-Maschine sind:

man 3 printf 

Dies wird ein zeigen Handbuchseite, ähnlich zu:

0 Der Wert sollte Null sein. Für die Konvertierungen d, i, o, u, x, X, a, A, e, E, f, F, g und G wird der konvertierte Wert auf links mit Nullen und nicht mit Leerzeichen aufgefüllt. Wenn die 0 und - Flags beide erscheinen, wird das Flag 0 ignoriert. Wenn eine Genauigkeit mit einer numerischen Konvertierung (d, i, o, u, x und X) angegeben wird, wird das 0-Flag ignoriert. Bei anderen Konvertierungen ist das Verhalten nicht definiert.

Auch wenn die Frage für C ist, kann this Seite Hilfe sein.

+0

Warum wird die 3 Nummer benötigt? – Elric

+1

@Elric Wenn Sie dem Befehl 'man' ein numerisches Argument geben, wird dieser auf diesen Abschnitt eingeschränkt. Ohne es erhalten Sie die man-Seite für den Shell-Befehl 'printf' anstelle der C-Funktion. –

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

Hier sagt "05" "verwenden Sie 5 Ziffern mit führenden Nullen".

138

Die richtige Lösung ist, die Postleitzahl als STRING in der Datenbank zu speichern. Trotz der Tatsache, dass es wie eine Nummer aussieht, ist es nicht. Es ist ein Code, in dem jeder Teil eine Bedeutung hat.

Eine Zahl ist eine Sache, die Sie arithmetisch ausführen. Eine Postleitzahl ist das nicht.

+19

Ya. Ihre Beobachtung ist absolut richtig. Das ist was ich mache. Die Person, die die Frage stellt, versucht jedoch wahrscheinlich, sich mit den Hausaufgaben zu befassen, anstatt mit dem Produktionscode. Die Antwort muss auf den Fragesteller zugeschnitten sein. – EvilTeach

+11

Ich denke, ich hätte es genauer umformulieren sollen, um zu verdeutlichen, dass ich schauen wollte, wie ich führende und nachlaufende Zeichen in einer mir unbekannten Sprache schreiben kann. Ich werde in Zukunft mit willkürlichen Beispielen vorsichtiger sein! – zxcv

+1

Andere Länder, wie UK haben Buchstaben in Postleitzahlen – jjxtra

16

Postleitzahl ist ein stark lokalisiertes Feld, viele Länder haben Zeichen in ihren Postleitzahlen, z. B. UK, Kanada. Daher sollten Sie in diesem Beispiel ein string/varchar-Feld verwenden, um es zu speichern, wenn Sie zu irgendeinem Zeitpunkt Benutzer/Kunden/Kunden/etc aus anderen Ländern versenden oder erhalten würden. Im allgemeinen Fall sollten Sie die empfohlene Antwort (printf("%05d", number);) verwenden.

3

Sie sparen sich eine Menge Ärger (langfristig), wenn Sie eine Postleitzahl als Zeichenkette speichern, die es ist, und nicht eine Nummer, die es nicht ist.

0

Flexibler .. Hier ist ein Beispiel zum Drucken von Zeilen rechtsbündiger Zahlen mit festen Breiten und Leerzeichen.

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

Die Funktion und Makro sind so konzipiert, dass die printfs besser lesbar sind.

+2

Ich bin nicht 100% sicher, Ihre Absicht mit dem Makro, aber es sieht aus wie Sie wollten eine Funktion definieren, wie '#define FMT (x) (getFmt (8, x) .c_str()) '(beachten Sie den * x * -Parameter!), im Gegensatz zu einer Variablen (was Ihr Code tut). – Ponkadoodle

0

Wenn Sie die Postleitzahl in einem Zeichenfeld zipcode [] speichern müssen, können Sie diese verwenden:

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