Führende Nullen in C drucken?


344

Ich versuche einen guten Weg zu finden, um führende Nullen zu drucken, wie z. B. 01001 für eine Postleitzahl. Während die Nummer als 1001 gespeichert wäre, was ist ein guter Weg, dies zu tun?

Ich dachte daran, beide case-Anweisungen / if zu verwenden, um herauszufinden, wie viele Stellen die Zahl ist, und sie dann zum Drucken in ein char-Array mit zusätzlichen Nullen umzuwandeln, aber ich kann nicht anders, als zu glauben, dass es eine Möglichkeit gibt, dies mit der zu tun Syntax im printf-Format, die mir entgeht.

Antworten:


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

Das 0zeigt an, womit Sie auffüllen, und das 5zeigt die Länge der Ganzzahl an. Wenn Sie beispielsweise "%02d"(Nützlich für Datumsangaben) verwenden, werden nur Nullen für Zahlen in der Einsen-Spalte aufgefüllt, dh ( 06anstelle von 6). Beispiel 2 "%03d"würde 2 Nullen für eine Zahl in der Einsen-Spalte und 1 Null für eine Zahl in der Zehner-Spalte auffüllen. dh. (Nummer 7 gepolstert 007und Nummer 17 gepolstert 017).


237
Bitte speichern Sie Postleitzahlen nicht als Nummern. Einige Länder haben Buchstaben in ihrer Postleitzahl.
Sec

1
Für Ihren Fall würde dies ausreichen. Wie kann man führende Nullen in einer ganzen Zahl unbekannter Länge haben?
Dominic Motuka

Sie müssen die maximale Länge der endgültigen gepolsterten Zeichenfolge kennen. Wenn Sie alternativ immer 5 führende Nullen wollten, dann "00000" + integer.to_s. etc
mlambie

160

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

Eine Zahl ist eine Sache, mit der Sie rechnen. Eine Postleitzahl ist das nicht.


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

15
Ich denke, ich hätte es genauer umformulieren sollen, um zu veranschaulichen, dass ich nach einer Möglichkeit suchte, Zeichen in einer Sprache zu führen, die ich nicht kannte. Ich werde in Zukunft mit willkürlichen Beispielen vorsichtiger sein!
zxcv

3
Andere Länder, wie Großbritannien, haben Buchstaben in Postleitzahlen
jjxtra


16

Die Postleitzahl ist ein stark lokalisiertes Feld. Viele Länder haben Zeichen in ihren Postleitzahlen, z. B. Großbritannien, Kanada. Daher sollten Sie in diesem Beispiel ein Zeichenfolgen- / Varchar-Feld verwenden, um es zu speichern, wenn Sie zu irgendeinem Zeitpunkt Benutzer / Kunden / Kunden / usw. aus anderen Ländern versenden oder abrufen würden.

Im allgemeinen Fall sollten Sie jedoch die empfohlene Antwort ( printf("%05d", number);) verwenden.


16

Wenn Sie sich auf einem * NIX-Computer befinden:

man 3 printf

Daraufhin wird eine Handbuchseite angezeigt, ähnlich:

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

Obwohl die Frage für C ist, kann diese Seite hilfreich sein.


1
Warum wird die 3 Nummer benötigt?
Eri0o

4
@Elric Wenn Sie dem manBefehl ein numerisches Argument geben , wird es auf diesen bestimmten Abschnitt eingegrenzt . Ohne diese Option erhalten Sie printfanstelle der C-Funktion die Manpage für den Shell-Befehl .
Paul Tomblin

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

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


6

printf ermöglicht verschiedene Formatierungsoptionen.

Ex:

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

3

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


Wenn nur jemand erklären würde, wie man ein char-Array auf Null setzt. Es gibt sogar eine Lösung, die atoi () verwendet, um das char-Array in ein init zu verwandeln und dann% 05d zu verwenden. Hoffe, dies ist nicht die einzige Lösung.
Niko

0

Flexibler. Hier ist ein Beispiel für das Drucken von Zeilen mit rechtsbündigen 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 das Makro sind so konzipiert, dass die printfs besser lesbar sind.


4
Ich bin mir Ihrer Absicht mit dem Makro nicht 100% sicher, aber es sieht so aus, als wollten Sie eine Funktion wie #define FMT(x) (getFmt(8,x).c_str())(beachten Sie das x) definieren Parameter!) , im Gegensatz zu einer Variablen (wie es Ihr Code tut).
Ponkadoodle

0

Wenn Sie die Postleitzahl in einer Postleitzahl [] eines Zeichenarrays speichern müssen, können Sie Folgendes verwenden:

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.