为数字指定最大printf字段宽度(必要时截断)?

时间:2012-03-31 04:54:01

标签: printf truncate format-specifiers

您可以使用printf字段宽度说明符截断字符串:

printf("%.5s", "abcdefgh");

> abcde

不幸的是,它不适用于数字(将d替换为x是相同的):

printf("%2d",   1234);  // for 34
printf("%.2d",  1234);  // for 34
printf("%-2d",  1234);  // for 12
printf("%-.2d", 1234);  // for 12

> 1234

是否有简单/琐碎的方式来指定要打印的位数,即使这意味着截断数字?

MSDN具体says that it will not happen,这似乎是不必要的限制。 (是的,它可以通过创建字符串等来完成,但我希望有“printf trick”或聪明的kludge。)

5 个答案:

答案 0 :(得分:22)

像许多我最好的想法一样,答案在我躺在床上时等着睡着了(当时没有什么可做的事情比思考的那样)。

使用模数!

printf("%2d\n", 1234%10);   // for 4
printf("%2d\n", 1234%100);  // for 34

printf("%2x\n", 1234%16);   // for 2
printf("%2x\n", 1234%256);  // for d2

它不理想,因为它不能从左侧截断(例如,12而不是34),但它适用于主要用例。例如:

// print a decimal ruler
for (int i=0; i<36; i++)
  printf("%d", i%10);

答案 1 :(得分:5)

如果要从右侧截断,可以将数字转换为字符串,然后使用字符串字段宽度说明符。

"%.3s".format(1234567.toString)

答案 2 :(得分:2)

来自Bash命令行的示例:

localhost ~$ printf "%.3s\n" $(printf "%03d"  1234)
123
localhost ~$ 

答案 3 :(得分:0)

您可以使用snprintf从右侧截断

char buf[10];
static const int WIDTH_INCL_NULL = 3;

snprintf(buf, WIDTH_INCL_NULL, "%d", 1234); // buf will contain 12

答案 4 :(得分:0)

为什么不从左边?唯一的区别是使用简单的划分:

printf("%2d", 1234/100); // you get 12