打印前导0';C中的s
我正在尝试找到一种打印前导打印前导0';C中的s,c,printf,C,Printf,我正在尝试找到一种打印前导0的好方法,例如为一个项目打印01001。虽然数字将存储为1001,但有什么好办法 我曾想过使用case语句或if来计算数字的位数,然后将其转换为一个字符数组,再加上额外的0,进行打印,但我忍不住想,也许有一种方法可以使用printf格式语法来实现这一点 printf("%05d", zipCode); 0表示填充的内容,5显示整数的宽度 示例1:如果使用“%02d”(对日期很有用),则只会在“1”列中为数字填充零。例如,06而不是6 示例2:“%
0
的好方法,例如为一个项目打印01001
。虽然数字将存储为1001
,但有什么好办法
我曾想过使用case
语句或if
来计算数字的位数,然后将其转换为一个字符
数组,再加上额外的0
,进行打印,但我忍不住想,也许有一种方法可以使用printf
格式语法来实现这一点
printf("%05d", zipCode);
0
表示填充的内容,5
显示整数的宽度
示例1:如果使用“%02d”
(对日期很有用),则只会在“1”列中为数字填充零。例如,06
而不是6
示例2:“%03d”
将在“一”列中为一个数字填充2个零,在“十”列中为一个数字填充1个零。例如,数字7填充到007
和数字17填充到017
printf允许各种格式选项
例如:
printf("leading zeros %05d", 123);
在最小字段宽度之前放置一个零:
printf("%05d", zipcode);
如果您在*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语言的,page可能会有所帮助
sprintf(mystring, "%05d", myInt);
这里,“05”表示“使用带前导零的5位数字”。正确的解决方案是将邮政编码作为字符串存储在数据库中。尽管它看起来像一个数字,但事实并非如此。这是一个代码,每个部分都有意义
数字是你计算的东西。邮政编码并非如此。邮政编码是一个高度本地化的字段,许多国家的邮政编码中都有字符,例如英国、加拿大。因此,在本例中,如果您要从其他国家运送或获取用户、客户、客户等,则应使用string/varchar字段来存储它
但是,在一般情况下,您应该使用建议的答案(
printf(“%05d”,number);
)。如果您将邮政编码存储为字符串,而不是数字,则会为自己节省大量麻烦(长期)。更灵活。。
下面是一个使用固定宽度和空格填充打印右对齐数字行的示例
//---- 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更具可读性。如果需要将邮政编码存储在字符数组中,
zipcode[]
,可以使用以下方法:
snprintf(zipcode, 6, "%05.5d", atoi(zipcode));
有两种方法可以输出带前导零的数字: 使用
0
标志和宽度说明符:
int zipcode = 123;
printf("%05d\n", zipcode); // Outputs 00123
int zipcode = 123;
printf("%.5d\n", zipcode); // Outputs 00123
使用精度说明符:
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
的输出:
printf("|%0d|%0d|\n", 0, 1); // Outputs |0|1|
printf("|%.0d|%.0d|\n", 0, 1); // Outputs ||1|
请不要将Zipcode存储为数字。有些国家的邮政编码中有字母。对于您的情况,这就足够了。一个长度未知的整数怎么可能有前导零?你需要知道最后填充字符串的最大长度。或者,如果您总是需要5个前导零,则“00000”+整数到_。埃特西亚。你的观察完全正确。我就是这么做的。然而,提出问题的人可能是在处理家庭作业,而不是生产代码。答案需要根据提出问题的人量身定制。我想我应该更准确地重新表述它,以说明我想看看如何用一种我不熟悉的语言写出前导字符和尾随字符。以后我会更加小心地使用任意的例子!其他国家,比如英国,在zip代码中有字母,但对于宏的意图不是100%肯定的,但是看起来你想定义一个函数,比如<代码> >定义fMT(x)(GETFMT(8,x).cx())<代码>(注意x参数!),而不是一个变量(这是你的代码所做的)。。为什么需要3这个数字?@Elric如果你给
man
命令一个数字参数,它会把它缩小到特定的部分。如果没有它,您将获得shell命令printf
的手册页,而不是C函数。如果有人能解释如何对字符数组进行零填充。甚至有一种解决方案使用atoi()将字符数组转换为init,然后使用%05d。希望这不是唯一的解决方案。@Niko我想你应该使用memcpy
等等来对字符数组进行零填充。但你到底为什么要这么做呢?很好的答案解决了OP打印有符号整数的问题。<代码> PRTFF < /COD>格式化是C的一个非常强大的特性。我通常是C++的粉丝,但是当涉及到这样的事情时,我倾向于恢复到C。