In 0 hàng đầu trong C?


344

Tôi đang cố gắng tìm một cách tốt để in hàng đầu 0, chẳng hạn như 01001 cho mã zip. Trong khi số lượng sẽ được lưu trữ là 1001, cách tốt để làm điều đó là gì?

Tôi đã nghĩ đến việc sử dụng một trong hai câu lệnh tình huống / nếu sau đó để tìm ra số đó có bao nhiêu chữ số và sau đó chuyển đổi nó thành một mảng char có thêm 0 để in nhưng tôi không thể không nghĩ rằng có thể có cách này để làm điều này với cú pháp định dạng printf đang trốn tránh tôi.

Câu trả lời:


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

Biểu thị 0cho biết bạn đang đệm gì và 5hiển thị độ dài của số nguyên. Ví dụ: nếu bạn sử dụng "%02d"(Hữu ích cho ngày), điều này sẽ chỉ đệm số không cho các số trong cột có nghĩa là ( 06thay vì 6). Ví dụ 2, "%03d"sẽ đệm 2 số không cho một số trong cột một và đệm 1 không cho một số trong cột hàng chục. I E. (số 7 được đệm đến 007và số 17 được đệm vào 017).


237
Vui lòng không lưu trữ mã zip dưới dạng số. Một số quốc gia có chữ cái trong mã zip của họ.
Giây

1
Đối với trường hợp của bạn, điều này sẽ đủ. Làm thế nào người ta có thể có các số 0 đứng đầu trong một số nguyên có độ dài không xác định?
Đaminh Motuka

Bạn cần biết độ dài tối đa của chuỗi đệm cuối cùng. Ngoài ra, nếu bạn luôn muốn có 5 số 0 đứng đầu, thì "00000" + số nguyên.to_s. vv
mlambie

160

Giải pháp chính xác là lưu trữ mã zip trong cơ sở dữ liệu dưới dạng CHUINGI. Mặc dù thực tế là nó có thể trông giống như một con số, nhưng không phải vậy. Đó là một mã, trong đó mỗi phần có ý nghĩa.

Một số là một điều bạn làm số học trên. Một mã zip không phải là điều đó.


32
Ya. Quan sát của bạn là hoàn toàn chính xác. Đó là những gì tôi làm. Tuy nhiên, người đặt câu hỏi có lẽ đang cố gắng giải quyết bài tập về nhà, thay vì mã sản xuất. Câu trả lời cần được điều chỉnh cho người đặt câu hỏi.
EvilTeach

15
Tôi cho rằng lẽ ra tôi nên đọc lại nó một cách chính xác hơn để minh họa rằng tôi đang tìm cách để tôi có thể thực hiện các ký tự dẫn đầu và theo dõi trong một ngôn ngữ mà tôi không quen thuộc. Tôi sẽ cẩn thận hơn với các ví dụ tùy ý trong tương lai!
zxcv

3
Các quốc gia khác, như Vương quốc Anh có chữ cái trong mã zip
jjxtra

47

Bạn đặt số 0 trước độ rộng trường tối thiểu:

printf("%05d",zipcode);

16

Zipcode là một lĩnh vực được địa phương hóa cao, nhiều quốc gia có các ký tự trong mã bưu điện của họ, ví dụ: Vương quốc Anh, Canada. Do đó, trong ví dụ này, bạn nên sử dụng trường chuỗi / varchar để lưu trữ nếu tại bất kỳ thời điểm nào bạn sẽ giao hàng hoặc nhận người dùng / khách hàng / khách hàng / vv từ các quốc gia khác.

Tuy nhiên trong trường hợp chung, bạn nên sử dụng câu trả lời được đề xuất ( printf("%05d", number);).


16

Nếu bạn đang sử dụng máy * NIX:

man 3 printf

Điều này sẽ hiển thị một trang hướng dẫn, tương tự như:

0 Giá trị phải được đệm bằng không. Đối với các chuyển đổi d, i, o, u, x, X, a, A, e, E, f, F, g và G, giá trị chuyển đổi được đệm ở bên trái bằng các số 0 thay vì khoảng trắng. Nếu cả hai cờ 0 và - xuất hiện, cờ 0 sẽ bị bỏ qua. Nếu độ chính xác được đưa ra với chuyển đổi số (d, i, o, u, x và X), cờ 0 bị bỏ qua. Đối với các chuyển đổi khác, hành vi là không xác định.

Mặc dù câu hỏi là cho C, này trang có thể được viện trợ.


1
Tại sao là 3 số cần thiết?
eri0o

4
@Elric Nếu bạn đưa ra một đối số số cho manlệnh, nó sẽ thu hẹp nó xuống phần cụ thể đó. Nếu không có nó, bạn sẽ có được trang man cho lệnh shell printfthay vì hàm C.
Paul Tomblin

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

Ở đây, "05" nói "sử dụng 5 chữ số với các số 0 đứng đầu".


6

printf cho phép các tùy chọn định dạng khác nhau.

Ví dụ:

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

3

Bạn sẽ tiết kiệm cho mình một đống rắc rối (về lâu dài) nếu bạn lưu trữ mã zip dưới dạng một chuỗi ký tự, chứ không phải là một số mà không phải là số.


Nếu chỉ có ai đó sẽ giải thích làm thế nào để zero-pad một mảng char. Thậm chí còn có một giải pháp sử dụng atoi () để biến mảng char thành init và sau đó sử dụng% 05d. Hy vọng đây không phải là giải pháp duy nhất.
Niko

0

Linh hoạt hơn .. Đây là một ví dụ in các hàng số hợp lý với độ rộng cố định và phần đệm không gian.

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

Các chức năng và macro được thiết kế để các bản in dễ đọc hơn.


4
Tôi không chắc chắn 100% về ý định của bạn với macro, nhưng có vẻ như bạn muốn xác định một chức năng, như #define FMT(x) (getFmt(8,x).c_str()) (lưu ý tham số x !), Trái ngược với một biến (đó là mã của bạn làm gì).
Ponkadoodle

0

Nếu bạn cần lưu trữ mã zip trong mã zip mảng ký tự [], bạn có thể sử dụng:

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.