Synetech
Synetech

Reputation: 9925

Specifying maximum printf field width for numbers (truncating if necessary)?

You can truncate strings with a printf field-width specifier:

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

> abcde

Unfortunately it does not work for numbers (replacing d with x is the same):

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

> 1234

Is there an easy/trivial way to specify the number of digits to be printed even if it means truncating a number?

MSDN specifically says that it will not happen which seems unnecessarily limiting. (Yes, it can be done by creating strings and such, but I’m hoping for a “printf trick” or clever kludge.)

Upvotes: 28

Views: 44950

Answers (5)

adrigiga
adrigiga

Reputation: 41

Example from Bash command line:

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

Upvotes: 4

troy
troy

Reputation: 714

Why not from the left? the only difference is to use simple division:

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

Upvotes: 0

KarlR
KarlR

Reputation: 11

You could use snprintf to truncate from the right

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

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

Upvotes: 1

Johannes Luong
Johannes Luong

Reputation: 584

If you want to truncate from the right you can convert your number to a string and then use the string field width specifier.

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

Upvotes: 8

Synetech
Synetech

Reputation: 9925

Like many of my best ideas, the answer came to me while lying in bed, waiting to fall asleep (there’s not much else to do at that time than think).

Use modulus!

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

It’s not ideal because it can’t truncate from the left (e.g., 12 instead of 34), but it works for the main use-cases. For example:

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

Upvotes: 30

Related Questions