您可以使用printf
字段宽度说明符截断字符串:
printf("%.5s", "abcdefgh");
> abcde
不幸的是,它不适用于数字(用x
替换d
是一样的):
printf("%2d", 1234); // for 34
printf("%.2d", 1234); // for 34
printf("%-2d", 1234); // for 12
printf("%-.2d", 1234); // for 12
> 1234
是否有一种简单/琐碎的方法来指定要打印的位数,即使这意味着要截断一个数字?
MSDN明确表示不会发生这种情况,这似乎是不必要的限制。(是的,可以通过创建字符串之类的方法来完成,但我希望有一个"printf技巧"或巧妙的拼凑。)
就像我的许多最佳想法一样,当我躺在床上等待入睡时,答案就来了(当时除了思考,没有什么可做的了)。
使用模量!
printf("%2dn", 1234%10); // for 4
printf("%2dn", 1234%100); // for 34
printf("%2xn", 1234%16); // for 2
printf("%2xn", 1234%256); // for d2
它并不理想,因为它不能从左边截断(例如,12
而不是34
),但它适用于主要用例。例如:
// print a decimal ruler
for (int i=0; i<36; i++)
printf("%d", i%10);
如果要从右边截断,可以将数字转换为字符串,然后使用字符串字段宽度说明符。
"%.3s".format(1234567.toString)
Bash命令行示例:
localhost ~$ printf "%.3sn" $(printf "%03d" 1234)
123
localhost ~$
您可以使用snprintf从右侧截断
char buf[10];
static const int WIDTH_INCL_NULL = 3;
snprintf(buf, WIDTH_INCL_NULL, "%d", 1234); // buf will contain 12
为什么不从左边开始?唯一的区别是使用简单的划分:
printf("%2d", 1234/100); // you get 12