添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I'm trying to find a good way to print leading 0 , such as 01001 for a ZIP Code . While the number would be stored as 1001 , what is a good way to do it?

I thought of using either case statements or if to figure out how many digits the number is and then convert it to an char array with extra 0 's for printing, but I can't help but think there may be a way to do this with the printf format syntax that is eluding me.

@AviPars: you are suggesting a c++ solution: std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl; which is a typesafe but vastly overworked alternative to printf("%05\n", (int)zipCode); chqrlie Mar 19, 2022 at 22:01 No, i was suggesting to do it manually with the ascii character '0' and a conditional statement A P Mar 20, 2022 at 10:17 @AviPars: sorry I misread the link. This manual approach is fine for a 2 digit number, but for a 5 digit zipCode, handling all possibilities requires more code unless you can assume zipCode to be a valid USA ZIP code which starts at 01001 chqrlie Mar 20, 2022 at 10:30 @chqrlie that's why i didnt submit it as an answer - but its nice for people to know that there are different ways of handling problems that are all valid A P Mar 20, 2022 at 10:41
printf("%05d", zipCode);

The 0 indicates what you are padding with and the 5 shows the width of the integer number.

Example 1: If you use "%02d" (useful for dates) this would only pad zeros for numbers in the ones column. E.g., 06 instead of 6.

Example 2: "%03d" would pad 2 zeros for one number in the ones column and pad 1 zero for a number in the tens column. E.g., number 7 padded to 007 and number 17 padded to 017.

For your case, this would suffice. How can one have leading zeroes in an integer of unknown length ? – Dominic Motuka May 10, 2018 at 14:58 You need to know the maximum length of the final padded string. Alternatively, if you always wanted 5 leading zeros, then "00000" + integer.to_s. etc – mlambie Mar 4, 2020 at 5:21

The correct solution is to store the ZIP Code in the database as a STRING. Despite the fact that it may look like a number, it isn't. It's a code, where each part has meaning.

A number is a thing you do arithmetic on. A ZIP Code is not that.

Ya. Your observation is absolutely correct. That is what I do. However the person asking the question is probably trying to deal with homework, instead of production code. The answer needs to be tailored to the person asking the question. – EvilTeach Sep 30, 2008 at 17:32 I suppose I should have rephrased it more precisely to illustrate I was looking to see how I can do leading and trailing characters in a language I wasn't familiar with. I'll be more careful with arbitrary examples in the future! – zxcv Sep 30, 2008 at 23:31

This will show a manual page, similar to:

0 The value should be zero padded. For d, i, o, u, x, X, a, A, e, E, f, F, g, and G conversions, the converted value is padded on the left with zeros rather than blanks. If the 0 and - flags both appear, the 0 flag is ignored. If a precision is given with a numeric conversion (d, i, o, u, x, and X), the 0 flag is ignored. For other conversions, the behavior is undefined.

Even though the question is for C, this page may be of aid.

@Elric If you give a numeric argument to the man command, it narrows it down to that particular section. Without it, you'll get the man page for the shell command printf instead of the C function. – Paul Tomblin Feb 25, 2018 at 16:51

ZIP Code is a highly localised field, and many countries have characters in their postcodes, e.g., UK, Canada. Therefore, in this example, you should use a string / varchar field to store it if at any point you would be shipping or getting users, customers, clients, etc. from other countries.

However, in the general case, you should use the recommended answer (printf("%05d", number);).

There are two ways to output your number with leading zeroes:

Using the 0 flag and the width specifier:

int zipcode = 123;
printf("%05d\n", zipcode);  // Outputs 00123

Using the precision specifier:

int zipcode = 123;
printf("%.5d\n", zipcode);  // Outputs 00123

The difference between these is the handling of negative numbers:

printf("%05d\n", -123);  // Outputs -0123 (pad to 5 characters)
printf("%.5d\n", -123);  // Outputs -00123 (pad to 5 digits)

ZIP Codes are unlikely to be negative, so it should not matter.

Note however that ZIP Codes may actually contain letters and dashes, so they should be stored as strings. Including the leading zeroes in the string is straightforward so it solves your problem in a much simpler way.

Note that in both examples above, the 5 width or precision values can be specified as an int argument:

int width = 5;
printf("%0*d\n", width, 123);  // Outputs 00123
printf("%.*d\n", width, 123);  // Outputs 00123

There is one more trick to know: a precision of 0 causes no output for the value 0:

printf("|%0d|%0d|\n", 0, 1);   // Outputs |0|1|
printf("|%.0d|%.0d|\n", 0, 1); // Outputs ||1|
                If only someone would explain how to zero-pad a char array. There is even a solution that uses atoi() to turn the char array to an init and then use %05d. Hope this is not the only solution.
– Niko
                Jan 15, 2019 at 15:31
                @Niko Well I guess you'd use memcpy and so on to zero-pad a char array. But why on earth would you want to do that?
– Героям слава
                Feb 18, 2021 at 9:19

More flexible.. Here's an example printing rows of right-justified numbers with fixed widths, and space-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

The function and macro are designed so the printfs are more readable.

I'm not 100% sure of your intention with the macro, but it looks like you meant to define a function, like #define FMT(x) (getFmt(8,x).c_str()) (note the x parameter!), as opposed to a variable (which is what your code does). – Ponkadoodle Aug 2, 2014 at 3:47 Dear @rch, the question was asked from c right..? but you provided c++ code.. Also for the good practice, you need to use less number of instructions and less amount of memory usage. – purushothaman poovai Apr 21, 2022 at 6:23