2008-09-30 65 views
236

Tôi đang cố gắng tìm một cách tốt để in hàng đầu của 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 nhất để làm điều đó là gì? Tôi nghĩ về việc sử dụng cả hai trường hợp báo cáo/nếu sau đó để tìm ra bao nhiêu chữ số số và sau đó chuyển đổi nó thành một mảng char với thêm 0 để in nhưng tôi không thể không nghĩ rằng có thể có một cách để làm điều này với cú pháp định dạng printf đang làm tôi khó chịu.In số 0 đứng đầu trong C?

Trả lời

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

+161

Xin đừng lưu trữ zipcodes như số. Một số quốc gia có chữ cái trong mã zip của họ. – Sec

7

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

ví dụ:

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

Bạn đặt một số không trước khi chiều rộng lĩnh vực tối thiểu:

printf("%05d",zipcode); 
14

Nếu bạn đang ở trên một máy * NIX:

man 3 printf 

này sẽ hiển thị một trang thủ công, tương tự như:

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

Mặc dù câu hỏi là dành cho trang C, this có thể trợ giúp.

+0

tại sao cần 3 số? – Elric

+1

@Elric Nếu bạn đưa ra một đối số dạng số cho lệnh 'man', nó sẽ thu hẹp nó xuống phần cụ thể đó. Không có nó, bạn sẽ nhận được trang man cho lệnh shell 'printf' thay vì hàm C. –

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

Ở đây, "05" cho biết "sử dụng 5 chữ số có số 0 đứng đầu".

138

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

Số là một thứ bạn làm số học trên. Mã zip không phải vậy.

+19

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 hỏi câu hỏi có lẽ đang cố gắng giải quyết bài tập về nhà, thay vì viết mã sản xuất. Câu trả lời cần được điều chỉnh cho người hỏi câu hỏi. – EvilTeach

+11

Tôi cho rằng tôi nên lặp lại nó chính xác hơn để minh họa cho tôi đang tìm cách xem tôi có thể làm các ký tự đầu và cuối bằng 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

+1

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

16

Mã zip là trường được bản địa hóa cao, nhiều quốc gia có ký tự trong mã bưu điện của họ, ví dụ: Vương quốc Anh, Canada. Vì vậy trong ví dụ này, bạn nên sử dụng một trường chuỗi/varchar để lưu trữ nó nếu tại bất kỳ điểm nào bạn sẽ được vận chuyển hoặc nhận người dùng/khách hàng/khách hàng/etc 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);).

3

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

0

Linh hoạt hơn .. Đây là ví dụ về các hàng in các số phải hợp lý với chiều rộng cố định và khoảng cách 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 

Chức năng và macro được thiết kế để printfs dễ đọc hơn.

+2

Tôi không chắc chắn 100% ý định của bạn với macro, nhưng có vẻ như bạn định nghĩa một hàm, 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). – Ponkadoodle

0

Nếu bạn cần lưu trữ các mã bưu điện trong một mã bưu điện mảng nhân vật [], bạn có thể sử dụng này:

snprintf(zipcode, 6, "%05.5d", atoi(zipcode)); 
Các vấn đề liên quan