在C中打印领先的0?

时间:2008-09-30 16:34:44

标签: c printf

我正在努力寻找打印前导0的好方法,例如01001的邮政编码。虽然这个数字会被存储为1001,但这样做的好方法是什么?

我想过使用任何一个case语句/如果然后弄清楚该数字是多少位数然后将其转换为一个带有额外0的打印的char数组,但我不禁想到可能有办法做这与printf格式语法,这是我的意思。

11 个答案:

答案 0 :(得分:511)

printf("%05d", zipCode);

答案 1 :(得分:154)

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

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

答案 2 :(得分:44)

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

printf("%05d",zipcode);

答案 3 :(得分:16)

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

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

答案 4 :(得分:14)

如果您使用的是* 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,this页面也可能有所帮助。

答案 5 :(得分:13)

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

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

答案 6 :(得分:7)

printf允许各种格式化选项。

例如:

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

答案 7 :(得分:3)

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

答案 8 :(得分:1)

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

使用 if __name__ ... 标志和宽度说明符:

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 没有输出:

0

答案 9 :(得分: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更具可读性。

答案 10 :(得分:0)

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

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