我想找到一个好的方法来打印前导 0
,例如邮政编码中的01001
。虽然该数字将被存储为1001
,但有什么好的方法可以做到这一点呢?
我考虑使用case
语句或if
语句来确定数字的位数,然后将其转换为带有额外0
的char
数组以进行打印,但我不禁想知道是否有一种使用printf
格式语法的方法可以实现此目的。
printf("%05d", zipCode);
0
表示填充字符,5
表示整数数字的宽度。
示例 1:如果使用 "%02d"
(用于日期),则只会在个位数前面填充零。例如,06
而不是 6
。
示例 2:"%03d"
会在个位数前填充 2 个零,在十位数前填充 1 个零。例如,数字 7 填充为 007
,数字 17 填充为 017
。
正确的解决方案是将邮政编码存储为字符串(STRING)在数据库中。尽管它看起来像一个数字,但实际上它不是数字,而是一种代码,其中每个部分都有意义。
数字是进行算术运算的东西。邮政编码不是这样的。
您可以在最小字段宽度前面加上零:
printf("%05d", zipcode);
sprintf(mystring, "%05d", myInt);
这里的"05"表示“使用5位带前导零的数字”。
如果您使用 *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语言的,这个页面可能会有帮助。
man
命令后面加上数字参数,它就会限定在特定的章节内搜索。如果不加,你将得到shell命令printf
的帮助文档而非C函数的文档。请注意,本翻译尽量保留原意并简化语言,如有歧义或错误,请以原文为准。 - Paul Tomblin邮政编码是一个高度本地化的领域,许多国家在其邮政编码中使用字符,例如英国、加拿大。因此,在任何时候如果您需要从其他国家发货或获取用户、客户、客户端等信息,您应该使用字符串/ varchar字段进行存储。
然而,在一般情况下,您应该使用推荐答案(printf("%05d", number);
)。
有两种方法可以输出以前导零的数字:
使用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
时不会输出任何内容:
printf("|%0d|%0d|\n", 0, 1); // Outputs |0|1|
printf("|%.0d|%.0d|\n", 0, 1); // Outputs ||1|
printf允许使用不同的格式选项。
例如:
printf("leading zeros %05d", 123);
如果你把ZIP码以字符形式存储,而不是数字形式,那么你将避免很多麻烦(长期来看)。因为ZIP码本质上是一个字符字符串,而不是一个数字。
memcpy
等函数来将字符数组填充为零。但是你到底为什么要这样做呢? - Героям славаzipcode[]
中,可以使用以下代码:snprintf(zipcode, 6, "%05.5d", atoi(zipcode));
std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;
,这是一种类型安全但工作量巨大的替代方案,可以替换为printf("%05\n", (int)zipCode);
- chqrlie01001
开始),否则处理所有可能性需要更多的代码。 - chqrlie