การพิมพ์ชั้นนำ 0 ใน C?


345

ฉันกำลังพยายามหาวิธีที่ดีในการพิมพ์นำ 0 ของเช่น 01001 สำหรับรหัสไปรษณีย์ ในขณะที่หมายเลขจะถูกเก็บไว้ที่ 1,001 วิธีที่ดีที่จะทำคืออะไร?

ฉันคิดว่าจะใช้ทั้งสองคำสั่ง case / ถ้าจะหาว่าตัวเลขเป็นตัวเลขแล้วแปลงเป็นอาร์เรย์ char ที่มี 0 พิเศษสำหรับการพิมพ์ แต่ฉันไม่สามารถช่วย แต่คิดว่าอาจมีวิธีการทำเช่นนี้กับ ไวยากรณ์รูปแบบ printf ที่ทำให้ฉันรำคาญ

คำตอบ:


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

ตัว0บ่งชี้สิ่งที่คุณกำลังเติมและ5แสดงความยาวของตัวเลขจำนวนเต็ม ตัวอย่างเช่นถ้าคุณใช้"%02d"(มีประโยชน์สำหรับวันที่) สิ่งนี้จะเป็นศูนย์สำหรับตัวเลขในคอลัมน์เดียวเช่น ( 06แทน6) ตัวอย่างที่ 2 "%03d"จะรวมศูนย์ 2 ตัวสำหรับตัวเลขหนึ่งตัวในคอลัมน์ ones และ pad 1 ศูนย์สำหรับตัวเลขในคอลัมน์หลักสิบ กล่าวคือ (หมายเลข 7 เบาะไปยัง007และหมายเลข 17 เบาะถึง017)


237
โปรดอย่าเก็บรหัสไปรษณีย์เป็นตัวเลข บางประเทศมีตัวอักษรในรหัสไปรษณีย์
วินาทีที่

1
สำหรับกรณีของคุณสิ่งนี้จะเพียงพอ เราจะมีศูนย์นำหน้าด้วยจำนวนเต็มของความยาวที่ไม่รู้จักได้อย่างไร
Dominic Motuka

คุณจำเป็นต้องทราบความยาวสูงสุดของสายอักขระสุดท้าย อีกทางหนึ่งถ้าคุณต้องการเลขศูนย์นำหน้า 5 ค่าดังนั้น "00000" + จำนวนเต็ม toto ฯลฯ
mlambie

160

วิธีการแก้ไขที่ถูกต้องคือการจัดเก็บรหัสไปรษณีย์ในฐานข้อมูลเป็นแบบ STRING แม้ว่าที่จริงแล้วมันอาจดูเหมือนเป็นตัวเลข แต่ก็ไม่ใช่ มันเป็นรหัสที่แต่ละส่วนมีความหมาย

ตัวเลขคือสิ่งที่คุณใช้คำนวณ รหัสไปรษณีย์ไม่ใช่อย่างนั้น


32
ยา การสังเกตของคุณถูกต้องอย่างแน่นอน นั่นคือสิ่งที่ฉันทำ อย่างไรก็ตามผู้ที่ถามคำถามนั้นอาจพยายามทำการบ้านแทนที่จะเป็นรหัสการผลิต คำตอบจะต้องได้รับการปรับให้เหมาะสมกับบุคคลที่ถามคำถาม
EvilTeach

15
ฉันคิดว่าฉันควรจะเรียบเรียงมันให้แม่นยำยิ่งขึ้นเพื่อแสดงให้เห็นว่าฉันกำลังมองหาวิธีที่ฉันสามารถนำตัวละครและต่อท้ายในภาษาที่ฉันไม่คุ้นเคย ฉันจะระวังตัวมากขึ้นด้วยตัวอย่างในอนาคต!
zxcv

3
ประเทศอื่น ๆ เช่นสหราชอาณาจักรมีตัวอักษรในรหัสไปรษณีย์
jjxtra


16

Zipcode เป็นฟิลด์ที่มีการแปลเป็นอย่างมากหลายประเทศมีอักขระในรหัสไปรษณีย์เช่นสหราชอาณาจักรแคนาดา ดังนั้นในตัวอย่างนี้คุณควรใช้เขตข้อมูลสตริง / varchar เพื่อจัดเก็บถ้า ณ เวลาใด ๆ คุณจะจัดส่งหรือรับผู้ใช้ / ลูกค้า / ลูกค้า / ฯลฯ จากประเทศอื่น ๆ

อย่างไรก็ตามในกรณีทั่วไปคุณควรใช้คำตอบที่แนะนำ ( printf("%05d", number);)


16

หากคุณอยู่ในเครื่อง * NIX:

man 3 printf

นี่จะแสดงหน้าคู่มือซึ่งคล้ายกับ:

0 มูลค่าควรเป็นศูนย์เบาะ สำหรับการแปลง d, i, o, u, x, X, a, A, e, E, f, F, g, และ G การแปลงค่าจะถูกเพิ่มทางด้านซ้ายด้วยศูนย์แทนที่จะว่าง หากทั้งสองค่าสถานะ 0 และ - ปรากฏขึ้นค่าสถานะ 0 จะถูกละเว้น หากความแม่นยำถูกกำหนดด้วยการแปลงตัวเลข (d, i, o, u, x, และ X) แฟล็ก 0 จะถูกละเว้น สำหรับการแปลงอื่น ๆ พฤติกรรมจะไม่ได้กำหนด

แม้ว่าคำถามนี้สำหรับ C หน้านี้อาจช่วยได้


1
เหตุใดจึงต้องใช้ 3 หมายเลข
eri0o

4
@Elric หากคุณให้อาร์กิวเมนต์ตัวเลขกับmanคำสั่งมันจะแคบลงไปยังส่วนเฉพาะนั้น หากไม่มีคุณจะได้รับ man page สำหรับคำสั่ง shell printfแทนที่จะเป็นฟังก์ชัน C
Paul Tomblin



3

คุณจะบันทึกปัญหาจำนวนมาก (ในระยะยาว) หากคุณเก็บรหัสไปรษณีย์เป็นสตริงอักขระซึ่งเป็นมากกว่าตัวเลขซึ่งไม่ใช่


ถ้ามีคนเพียงคนเดียวที่จะอธิบายวิธีการ zero-pad อาร์เรย์ char มีแม้แต่วิธีแก้ปัญหาที่ใช้ atoi () เพื่อเปลี่ยนอาร์เรย์ char เป็น init แล้วใช้% 05d หวังว่านี่ไม่ใช่ทางออกเดียว
Niko

0

มีความยืดหยุ่นมากขึ้น .. นี่คือตัวอย่างการพิมพ์แถวของตัวเลขที่ถูกต้องที่มีความกว้างคงที่และการเว้นวรรค

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

ฟังก์ชั่นและมาโครได้รับการออกแบบเพื่อให้ printfs อ่านได้ง่ายขึ้น


4
ฉันไม่แน่ใจ 100% ว่าคุณตั้งใจใช้มาโคร แต่ดูเหมือนว่าคุณตั้งใจจะกำหนดฟังก์ชั่นเช่น#define FMT(x) (getFmt(8,x).c_str())(สังเกตพารามิเตอร์x !) ตรงข้ามกับตัวแปร (ซึ่งเป็นรหัสของคุณ)
Ponkadoodle

0

หากคุณต้องการเก็บรหัสไปรษณีย์ไว้ในรหัสอาร์เรย์ตัวอักษร [] คุณสามารถใช้สิ่งนี้:

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.