Указание максимальной ширины поля printf для чисел (усечение при необходимости)? - PullRequest
16 голосов
/ 31 марта 2012

Вы можете обрезать строки с помощью 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 говорит, что этого не произойдет , что представляется излишне ограничивающим. (Да, это может быть сделано путем создания строк и тому подобного, но я надеюсь на «трюк с printf» или умный ключ.)

Ответы [ 5 ]

23 голосов
/ 31 марта 2012

Как и многие из моих лучших идей, ответ пришел ко мне, когда я лежал в постели, ожидая, что засну (в то время больше нечего делать, чем думать).

Используйте модуль!

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);
5 голосов
/ 12 мая 2013

Если вы хотите обрезать справа, вы можете преобразовать свое число в строку, а затем использовать спецификатор ширины поля строки.

3 голосов
/ 20 апреля 2017

Пример из командной строки Bash:

localhost ~$ printf "%.3s\n" $(printf "%03d"  1234)
123
localhost ~$ 
0 голосов
/ 20 марта 2014

Почему не слева?единственное отличие заключается в использовании простого деления:

printf("%2d", 1234/100); // you get 12
0 голосов
/ 09 февраля 2014

Вы можете использовать snprintf для усечения справа

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

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