Mencetak angka 0 di C?

344

Saya mencoba menemukan cara yang baik untuk mencetak 0 di awal, seperti 01001 untuk kode pos. Sementara nomor akan disimpan sebagai 1001, apa cara yang baik untuk melakukannya?

Saya berpikir untuk menggunakan salah satu pernyataan kasus / jika kemudian untuk mencari tahu berapa digit angka itu dan kemudian mengubahnya menjadi array char dengan 0 ekstra untuk dicetak tetapi saya tidak dapat membantu tetapi berpikir mungkin ada cara untuk melakukan ini dengan sintaks format printf yang mengelak dari saya.

zxcv
sumber

Jawaban:

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

The 0menunjukkan apa yang Anda melapisi dengan dan 5menunjukkan panjang jumlah integer. Sebagai contoh jika Anda menggunakan "%02d"(Berguna untuk tanggal) ini hanya akan memberi angka nol pada angka di kolom yang yaitu ( 06bukan 6). Contoh 2, "%03d"akan memuat 2 angka nol untuk satu angka di kolom yang dan angka 1 nol untuk angka di kolom puluhan. yaitu. (nomor 7 empuk ke 007dan 17 empuk ke 017).

EvilTeach
sumber
237
Tolong jangan menyimpan kode pos sebagai angka. Beberapa negara memiliki surat dalam kode pos mereka.
Sec
1
Untuk kasus Anda, ini sudah cukup. Bagaimana seseorang bisa memiliki nol di dalam bilangan bulat dengan panjang yang tidak diketahui?
Dominic Motuka
Anda perlu mengetahui panjang maksimal dari string padded akhir. Atau, jika Anda selalu menginginkan 5 angka nol di depan, maka "00000" + integer.to_s. dll
mlambie
160

Solusi yang benar adalah dengan menyimpan kode pos dalam database sebagai STRING. Terlepas dari kenyataan bahwa itu mungkin terlihat seperti angka, tidak. Ini kode, di mana setiap bagian memiliki makna.

Angka adalah hal yang Anda lakukan aritmatika. Kode pos bukan itu.

James Curran
sumber
32
Ya Pengamatan Anda benar sekali. Itu yang saya lakukan. Namun orang yang mengajukan pertanyaan mungkin mencoba menangani pekerjaan rumah, alih-alih kode produksi. Jawabannya perlu disesuaikan dengan orang yang mengajukan pertanyaan.
EvilTeach
15
Saya kira saya harus mengulanginya dengan lebih tepat untuk menggambarkan bahwa saya ingin melihat bagaimana saya bisa memimpin dan mengekor karakter dalam bahasa yang tidak saya kenal. Saya akan lebih berhati-hati dengan contoh sewenang-wenang di masa depan!
zxcv
3
Negara-negara lain, seperti Inggris memiliki surat dalam kode pos
jjxtra
47

Anda menempatkan nol sebelum lebar bidang minimum:

printf("%05d",zipcode);
Adam Bellaire
sumber
16

Kode pos adalah bidang yang sangat dilokalkan, banyak negara memiliki karakter dalam kode pos mereka, misalnya, Inggris, Kanada. Karena itu dalam contoh ini Anda harus menggunakan bidang string / varchar untuk menyimpannya jika suatu saat Anda akan mengirim atau mendapatkan pengguna / pelanggan / klien / dll dari negara lain.

Namun dalam kasus umum Anda harus menggunakan jawaban yang disarankan ( printf("%05d", number);).

Astaga
sumber
16

Jika Anda menggunakan Mesin * NIX:

man 3 printf

Ini akan menampilkan halaman manual, mirip dengan:

Nilai nol harus diisi. Untuk konversi d, i, o, u, x, X, a, A, e, E, f, F, g, dan G, nilai yang dikonversi empuk di sebelah kiri dengan nol daripada kosong. Jika 0 dan - flag keduanya muncul, 0 flag diabaikan. Jika presisi diberikan dengan konversi numerik (d, i, o, u, x, dan X), bendera 0 diabaikan. Untuk konversi lain, perilaku tidak terdefinisi.

Meskipun pertanyaannya adalah untuk C, halaman ini mungkin bisa membantu.

Paul Tomblin
sumber
1
mengapa 3 angka itu dibutuhkan?
eri0o
4
@ Elric Jika Anda memberikan argumen numerik ke manperintah, itu mempersempitnya ke bagian tertentu. Tanpanya, Anda akan mendapatkan halaman manual untuk perintah shell printfalih-alih fungsi C.
Paul Tomblin
14
sprintf(mystring, "%05d", myInt);

Di sini, "05" mengatakan "gunakan 5 digit dengan angka nol di depan".

Dan Hewett
sumber
6

printf memungkinkan berbagai opsi pemformatan.

ex:

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

Anda akan menyelamatkan diri dari tumpukan masalah (jangka panjang) jika Anda menyimpan kode pos sebagai string karakter, yang artinya, bukan angka, yang bukan.

pro3carp3
sumber
Kalau saja seseorang akan menjelaskan cara nol-pad array char. Bahkan ada solusi yang menggunakan atoi () untuk mengubah array char menjadi init dan kemudian menggunakan% 05d. Semoga ini bukan satu-satunya solusi.
Niko
0

Lebih fleksibel .. Berikut adalah contoh mencetak deretan angka yang dibenarkan benar dengan lebar tetap, dan ruang-padding.

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

Fungsi dan makro dirancang agar printfs lebih mudah dibaca.

rch
sumber
4
Saya tidak 100% yakin dengan niat Anda dengan makro, tetapi sepertinya Anda bermaksud mendefinisikan suatu fungsi, seperti #define FMT(x) (getFmt(8,x).c_str())(perhatikan parameter x !), Yang bertentangan dengan variabel (yang merupakan kode Anda).
Ponkadoodle
0

Jika Anda perlu menyimpan kode pos dalam kode pos array karakter [], Anda dapat menggunakan ini:

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