Czy drukujesz wiodące zera w C?

345

Próbuję znaleźć dobry sposób na wydrukowanie wiodących zer, na przykład 01001 dla kodu pocztowego. Chociaż numer byłby przechowywany jako 1001, jaki jest dobry sposób na zrobienie tego?

Zastanawiałem się nad użyciem instrukcji case / /, aby dowiedzieć się, ile cyfr to liczba, a następnie przekonwertować ją na tablicę znaków z dodatkowymi zerami do wydrukowania, ale nic nie poradzę, ale myślę, że można to zrobić za pomocą wymyka mi się składnia formatu printf.

zxcv
źródło

Odpowiedzi:

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

0Wskazuje czego dopełnienie z a 5przedstawia długość liczby całkowitej. Na przykład, jeśli użyjesz "%02d"(Przydatne dla dat), spowoduje to wstawienie zer tylko dla liczb w kolumnie jedynki, tj. ( 06Zamiast 6). W przykładzie 2 "%03d"wstawiono 2 zera dla jednej liczby w kolumnie jedynki i uzupełniono 1 zero dla liczby w kolumnie dziesiątek. to znaczy. (numer 7 uzupełniony 007i numer 17 uzupełniony 017).

EvilTeach
źródło
237
Nie przechowuj kodów pocztowych jako liczb. Niektóre kraje mają litery w kodzie pocztowym.
Sec
1
W twoim przypadku to wystarczy. Jak można mieć wiodące zera w liczbie całkowitej o nieznanej długości?
Dominic Motuka
Musisz znać maksymalną długość ostatniego usztywnionego sznurka. Alternatywnie, jeśli zawsze chciałeś 5 zer wiodących, to „00000” + liczba całkowita.to_s. itp.
mlambie,
160

Prawidłowym rozwiązaniem jest przechowywanie kodu pocztowego w bazie danych jako STRING. Pomimo tego, że może wyglądać jak liczba, nie jest. Jest to kod, w którym każda część ma znaczenie.

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

James Curran
źródło
32
Ya. Twoja obserwacja jest całkowicie poprawna. Tak robię. Jednak osoba zadająca pytanie prawdopodobnie próbuje poradzić sobie z pracą domową zamiast kodu produkcyjnego. Odpowiedź musi być dostosowana do osoby zadającej pytanie.
EvilTeach 30.09.08
15
Przypuszczam, że powinienem był to sformułować bardziej precyzyjnie, aby zilustrować, że chciałem zobaczyć, jak mogę tworzyć wiodące i końcowe znaki w języku, którego nie znałem. W przyszłości będę bardziej ostrożny z przypadkowymi przykładami!
zxcv
3
Inne kraje, takie jak Wielka Brytania, mają litery w kodach pocztowych
jjxtra,
47

Umieszczasz zero przed minimalną szerokością pola:

printf("%05d",zipcode);
Adam Bellaire
źródło
16

Kod pocztowy to bardzo zlokalizowane pole, wiele krajów ma znaki w swoich kodach pocztowych, np. Wielka Brytania, Kanada. Dlatego w tym przykładzie powinieneś użyć pola string / varchar do przechowywania go, jeśli w dowolnym momencie wysyłasz lub pozyskujesz 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);).

JeeBee
źródło
16

Jeśli korzystasz z komputera * NIX:

man 3 printf

Spowoduje to wyświetlenie strony podręcznika podobnej do:

0 Wartość powinna być zerowana. W przypadku konwersji d, i, o, u, x, X, a, A, e, E, f, F, g i G przekonwertowana wartość jest uzupełniana po lewej stronie zerami, a nie spacjami. Jeśli pojawią się obie flagi 0 i -, flaga 0 jest ignorowana. Jeśli podano precyzję z konwersją numeryczną (d, i, o, u, x i X), flaga 0 jest ignorowana. W przypadku innych konwersji zachowanie jest niezdefiniowane.

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

Paul Tomblin
źródło
1
dlaczego potrzebna jest liczba 3?
eri0o
4
@Elric Jeśli podasz argument numeryczny do manpolecenia, zawęża ono je do tej konkretnej sekcji. Bez tego dostaniesz stronę man dla polecenia powłoki printfzamiast funkcji C.
Paul Tomblin,
14
sprintf(mystring, "%05d", myInt);

W tym miejscu „05” mówi „użyj 5 cyfr z zerami na początku”.

Dan Hewett
źródło
6

printf pozwala na różne opcje formatowania.

dawny:

printf("leading zeros %05d", 123);
Trent
źródło
3

Zaoszczędzisz sobie kupy kłopotów (długoterminowych), jeśli przechowujesz kod pocztowy jako ciąg znaków, którym jest, a nie liczbą, którą nie jest.

pro3carp3
źródło
Gdyby tylko ktoś wyjaśnił, jak zerować tablicę znaków. Istnieje nawet rozwiązanie wykorzystujące atoi (), aby zmienić tablicę char na init, a następnie użyć% 05d. Mam nadzieję, że to nie jedyne rozwiązanie.
Niko
0

Bardziej elastyczny. Oto przykład drukowania rzędów liczb z wyrównaniem do prawej ze stałymi szerokościami 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 printfs były bardziej czytelne.

rch
źródło
4
Nie jestem w 100% pewien twojego zamiaru z makrem, ale wygląda na to, że chciałeś zdefiniować funkcję, taką jak #define FMT(x) (getFmt(8,x).c_str())(zwróć uwagę na parametr x !), W przeciwieństwie do zmiennej (co robi twój kod).
Ponkadoodle
0

Jeśli chcesz zapisać kod pocztowy w postaci kodu pocztowego [], możesz użyć tego:

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
Brad Jennings
źródło