23
4

5 回答 5

29

就像我许多最好的想法一样,我躺在床上等待入睡时得到了答案(当时除了思考之外别无他法)。

使用模数!

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);
于 2012-03-31T16:27:05.453 回答
7

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

"%.3s".format(1234567.toString)
于 2013-05-12T12:08:27.310 回答
3

来自 Bash 命令行的示例:

localhost ~$ printf "%.3s\n" $(printf "%03d"  1234)
123
localhost ~$ 
于 2017-04-20T13:09:43.750 回答
1

您可以使用 snprintf 从右侧截断

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

snprintf(buf, WIDTH_INCL_NULL, "%d", 1234); // buf will contain 12
于 2014-02-09T00:57:11.820 回答
0

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

printf("%2d", 1234/100); // you get 12
于 2014-03-20T12:54:47.693 回答