在C中打印前导0?


343

我试图找到一种打印前导0的好方法,例如邮政编码为01001。虽然该数字将存储为1001,但是这样做的一种好方法是什么?

我想使用任一种case语句/ if,然后找出数字的位数,然后将其转换为带有额外0的char数组以进行打印,但我忍不住想了想用我无法理解的printf格式语法。

Answers:


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

0显示你所用填充和5表演的整数倍的长度。例如,如果你使用"%02d"(用于日期)这只能垫零在那些列,即数字。(06而不是6)。示例2,"%03d"将在one列中为一个数字填充2个零,在tens列中为一个数字填充1个零。即。(将填充为7,将填充为00717 017)。


237
请不要将邮政编码存储为数字。一些国家的邮政编码中包含字母。
二段

1
对于您的情况,这就足够了。一个人如何在未知长度的整数中具有前导零?
多米尼克·莫图卡

您需要知道最终填充字符串的最大长度。或者,如果您始终想要5个前导零,则为“ 00000” + integer.to_s。等等
mlambie

160

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

数字是您要进行算术运算的事情。邮政编码不是这样。


32
嗯 您的观察是绝对正确的。那就是我所做的。但是,提出这个问题的人可能正在尝试处理作业,而不是生产代码。答案需要针对提出问题的人量身定制。
EvilTeach

15
我想我应该更准确地改写它,以说明我希望了解如何以一种我不熟悉的语言来做开头和结尾字符。将来,我将在处理任意示例时更加小心!
zxcv

3
其他国家/地区,例如英国,也有邮政编码的字母
jjxtra,2016年


16

邮政编码是一个高度本地化的字段,许多国家/地区的邮政编码中都包含字符,例如英国,加拿大。因此,在此示例中,如果要在任何时候运送或从其他国家/地区获取用户/客户/客户/客户,则应使用字符串/ 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命令提供数字参数,则会将其范围缩小到该特定部分。没有它,您将获得shell命令的手册页,printf而不是C函数。
Paul Tomblin '18

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

此处,“ 05”表示“使用前导零的5位数字”。


6

printf允许各种格式设置选项。

例如:

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

3

如果将邮政编码存储为字符串而不是数字而不是数字,则可以避免麻烦(长期)。


如果只能有人解释如何将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

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

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.