389

我正在尝试找到一种打印前导的好方法,0例如ZIP Code。虽然数字将存储为,但有什么好的方法呢?010011001

我曾想过使用任一case语句或if找出数字的位数,然后将其转换为char带有额外 's 的数组以0进行打印,但我不禁认为可能有一种方法可以使用printf格式语法来做到这一点这让我望而却步。

4

11 回答 11

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

0指示您要填充的内容,并显示5整数的宽度。

示例 1:如果您使用"%02d"(对日期有用),这只会为个数列中的数字填充零。例如,06代替6.

示例 2:"%03d"将为个列中的一个数字填充 2 个零,为十列中的一个数字填充 1 个零。例如,数字 7 填充到007和数字 17 填充到017

于 2008-09-30T16:36:18.587 回答
174

正确的解决方案是将邮政编码作为字符串存储在数据库中。尽管它可能看起来像一个数字,但事实并非如此。这是一个代码,每个部分都有意义。

数字是你做算术的东西。邮政编码不是那样。

于 2008-09-30T16:39:49.387 回答
48

您在最小字段宽度之前放置一个零:

printf("%05d", zipcode);
于 2008-09-30T16:36:37.103 回答
17
sprintf(mystring, "%05d", myInt);

在这里,“05”表示“使用前导零的 5 位数字”。

于 2008-09-30T16:37:38.597 回答
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 的,但此页面可能会有所帮助。

于 2008-09-30T16:37:12.453 回答
16

邮政编码是一个高度本地化的字段,许多国家的邮政编码中都有字符,例如英国、加拿大。因此,在此示例中,如果您在任何时候要从其他国家/地区运送或获取用户、客户、客户等,您应该使用字符串/varchar 字段来存储它。

但是,在一般情况下,您应该使用推荐的答案 ( printf("%05d", number);)。

于 2008-09-30T16:42:49.100 回答
6

printf允许各种格式化选项。

例子:

printf("leading zeros %05d", 123);
于 2008-09-30T16:36:36.057 回答
6

有两种方法可以输出带有前导零的数字:

使用0标志和宽度说明符:

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

使用精度说明符:

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

它们之间的区别在于对负数的处理:

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

邮政编码不太可能是负数,所以这无关紧要。

但请注意,邮政编码实际上可能包含字母和破折号,因此它们应存储为字符串。在字符串中包含前导零很简单,因此它以更简单的方式解决了您的问题。

请注意,在上面的两个示例中,5宽度或精度值都可以指定为int参数:

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

还有一个技巧要知道:精度0导致 value 没有输出0

printf("|%0d|%0d|\n", 0, 1);   // Outputs |0|1|
printf("|%.0d|%.0d|\n", 0, 1); // Outputs ||1|
于 2021-02-06T22:32:57.550 回答
2

如果您将邮政编码存储为字符串,而不是数字,那么您将为自己省去一大堆麻烦(长期)。

于 2008-09-30T17:34:26.370 回答
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 更具可读性。

于 2014-04-19T06:59:59.630 回答
0

如果您需要将邮政编码存储在字符数组中zipcode[],您可以使用:

snprintf(zipcode, 6, "%05.5d", atoi(zipcode));
于 2015-06-19T14:30:01.000 回答