我试图找到一个好方法打印前导0,如01001邮政编码。当这个数字被存储为1001时,什么是一个好方法呢?

我想过使用case语句或if来计算出数字是多少位,然后将其转换为带有额外0的字符数组进行打印,但我不禁想,可能有一种方法可以用printf格式语法来做到这一点,这是逃避我的。


当前回答

更灵活的. . 下面是一个示例,打印具有固定宽度和空格填充的右对齐数字行。

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

函数和宏的设计使打印文件更具可读性。

其他回答

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

snprintf(zipcode, 6, "%05.5d", atoi(zipcode));

正确的解决方案是将ZIP Code作为STRING存储在数据库中。尽管它看起来像一个数字,但它不是。这是一个代码,每个部分都有意义。

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

更灵活的. . 下面是一个示例,打印具有固定宽度和空格填充的右对齐数字行。

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

函数和宏的设计使打印文件更具可读性。

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

printf("%05d", zipcode);

如果你在*nix机器上:

man 3 printf

这将显示一个手册页面,类似于:

该值应该是填充的。对于d i o u x x a a e, E, f, f, g和g转换,转换后的值被填充 左边是0而不是空。如果0和-标志 两者都出现时,0标志将被忽略。如果给出了精度 使用数值转换(d, i, o, u, x和x), 0标志为 忽略了。对于其他转换,行为是未定义的。

即使问题是针对C的,这一页可能会有所帮助。