我试图找到一个好方法打印前导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

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

其他回答

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

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

有两种方法输出前导为零的数字:

使用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个width或precision值可以指定为int参数:

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

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

printf("|%0d|%0d|\n", 0, 1);   // Outputs |0|1|
printf("|%.0d|%.0d|\n", 0, 1); // Outputs ||1|

Printf允许各种格式选项。

例子:

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

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

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

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

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

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