Drukowanie 0 ' s W C

Próbuję znaleźć dobry sposób na wydrukowanie wiodącego 0, np. 01001 dla kodu pocztowego. Chociaż liczba byłaby przechowywana jako 1001, Jaki jest dobry sposób, aby to zrobić?

Pomyślałem o użyciu instrukcji case lub if, aby dowiedzieć się, ile cyfr jest liczbą, a następnie przekonwertować ją na tablicę char z dodatkowymi tablicami 0 do drukowania, ale nie mogę pomóc, ale myślę, że może być sposób, aby to zrobić ze składnią formatu printf, która mi umyka.

 366
Author: Neuron, 2008-09-30

11 answers

printf("%05d", zipCode);

0 wskazuje, co wypełniasz, a 5 pokazuje szerokość liczby całkowitej.

Przykład 1: jeśli użyjesz "%02d" (użytecznego dla DAT), to będzie to tylko zer dla liczb w kolumnie one. Np. 06 zamiast 6.

Przykład 2: "%03d" wstawia 2 zera dla jednej liczby w kolumnie jedynek i 1 zero dla liczby w kolumnie dziesiątek. Np. numer 7 wyściełany do 007 i numer 17 wyściełany do 017.

 601
Author: EvilTeach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-11 20:40:47

Poprawnym rozwiązaniem jest przechowywanie kodu pocztowego w bazie danych jako ciąg znaków. Pomimo faktu, że może wyglądać jak liczba, nie jest. to kod, w którym każda część ma znaczenie.

Liczba to rzecz, na której robisz arytmetykę. Kod pocztowy to nie to.

 165
Author: James Curran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-06 22:17:43

Umieszczasz zero przed minimalną szerokością pola:

printf("%05d", zipcode);
 46
Author: Adam Bellaire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-06 22:05:46
sprintf(mystring, "%05d", myInt);

Tutaj "05" mówi "użyj 5 cyfr z wiodącymi zerami".

 16
Author: Dan Hewett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-09 07:54:50

Jeśli jesteś na maszynie * nix:

man 3 printf

Wyświetli stronę podręcznika, podobną do:

0 wartość powinna być zerowa. Dla d, I, o, U, x, X, a, A, e, Konwersje E, f, F, g i G, przeliczona wartość jest wyściełana na lewa z zerami, a nie spacjami. If the 0 and - flags oba są wyświetlane, znacznik 0 jest ignorowany. Jeśli podana jest dokładność przy konwersji numerycznej (d, I, o, U, x I X) znacznik 0 jest ignorowane. Dla innych konwersji zachowanie jest undefined.

Chociaż pytanie dotyczy C, ta strona może być pomocna.

 16
Author: Paul Tomblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-06 22:06:27

Kod pocztowy jest wysoce zlokalizowanym polem, a wiele krajów ma znaki w swoich kodach pocztowych, np. Dlatego w tym przykładzie powinieneś użyć pola string / varchar do przechowywania go, jeśli w dowolnym momencie będziesz wysyłał lub uzyskiwał użytkowników, klientów, klientów itp. z innych krajów.

Jednak w ogólnym przypadku należy użyć zalecanej odpowiedzi (printf("%05d", number);).

 16
Author: JeeBee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-06 22:18:20

printf umożliwia różne opcje formatowania.

Przykład:

printf("leading zeros %05d", 123);
 6
Author: Trent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-06 22:05:27

Oszczędzisz sobie kłopotu (długoterminowego), jeśli przechowasz Kod Pocztowy jako ciąg znaków, którym jest, a nie numer, którym nie jest.

 2
Author: pro3carp3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-06 22:21:24

Bardziej elastyczny.. Oto przykład drukowania wierszy z justowanymi liczbami o stałych szerokościach i odstępami.

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

Funkcja i makro są tak zaprojektowane, aby wydruki były bardziej czytelne.

 0
Author: rch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-19 06:59:59

Jeśli chcesz zapisać kod pocztowy w tablicy znaków, zipcode[], możesz użyć tego:

snprintf(zipcode, 6, "%05.5d", atoi(zipcode));
 0
Author: Brad Jennings,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-06 22:19:13

Istnieją 2 sposoby wypisywania liczby z czołowymi zerami:

Użycie flagi 0 i określenia szerokości:

int zipcode = 123;
printf("%05d\n", zipcode);  // outputs 00123

Użycie specyfikacji precyzji:

int zipcode = 123;
printf("%.5d\n", zipcode);  // outputs 00123

Różnica między nimi polega na obsłudze liczb ujemnych:

printf("%05d\n", -123);  // outputs -0123 (pad to 5 characters)
printf("%.5d\n", -123);  // outputs -00123 (pad to 5 digits)

Kody pocztowe raczej nie będą negatywne, więc nie powinno to mieć znaczenia.

Należy jednak pamiętać, że kody pocztowe mogą faktycznie zawierać litery i myślniki, więc powinny być przechowywane jako ciągi znaków. Łącznie z czołowymi zerami w string jest prosty, więc rozwiązuje twój problem w znacznie prostszy sposób.

Zauważ, że w obu powyższych przykładach wartości 5 Szerokość lub precyzja mogą być podane jako argument int:

int width = 5;
printf("%0*d\n", width, 123);  // outputs 00123
printf("%.*d\n", width, 123);  // outputs 00123

Jest jeszcze jedna sztuczka do poznania: precyzja 0 nie powoduje wyjścia dla wartości 0:

printf("|%0d|%0d|\n", 0, 1);  // outputs |0|1|
printf("|%.0d|%.0d|\n", 0, 1);  // outputs ||1|
 0
Author: chqrlie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-06 22:32:57