Python String Formatting

Education is not limited to just classrooms. It can be gained anytime, anywhere... - Ravi Ranjan (M.Tech-NIT)

format() method allows you format string in any way you want.

Syntax: template.format(p1, p1, .... , k1=v1, k2=v2)

template is a string containing format codes, format()  method uses it’s argument to substitute value for each format codes. For e.g

1

>>> 'Sam has {0} red balls and {1} yellow balls'.format(12, 31)

{0}  and {1}  are format codes. The format code {0}  is replaced by the first argument offormat()  i.e 12 , while {1}  is replaced by the second argument of format()  i.e 31 .

Expected Output:

1

Sam has 12 red balls and 31 yellow balls

This technique is okay for simple formatting but what if you want to specify precision in floating point number ? For such thing you need to learn more about format codes. Here is the full syntax of format codes.

Syntax: {[argument_index_or_keyword]:[width][.precision][type]}

type  can be used with format codes

FORMAT CODES DESCRIPTION
d for integers
f for floating point numbers
b for binary numbers
o for octal numbers
x for octal hexadecimal numbers
s for string
e for floating point in exponent format

Following examples will make things more clear.

Example 1:

1

>>> "Floating point {0:.2f}".format(345.7916732)

Here we specify 2  digits of precision and f  is used to represent floating point number.

Expected Output:

1

Floating point 345.79

Example 2:

1

2

>>> import math

>>> "Floating point {0:10.3f}".format(math.pi)

Here we specify 3  digits of precision, 10  for width and f  for floating point number.

Expected Output:

1

Floating point 3.142

Example 3:

1

"Floating point pi = {0:.3f}, with {1:d} digit precision".format(math.pi, 3)

here d  in {1:d} represents integer value.

Expected Output:

1

Floating point pi = 3.142, with 3 digit precision

You need to specify precision only in case of floating point numbers if you specify precision for integer ValueError  will be raised.

Example 5:

1

'Sam has {1:d} red balls and {0:d} yellow balls'.format(12, 31)

Expected Output:

1

Sam has 31 red balls and 12 yellow balls

Example 6:

1

"In binary 4 is {0:b}".format(4) # b for binary, refer to Fig 1.1

Expected Output:

1

In binary 4 is 100

Example 7:

1

2

array = [34, 66, 12]

"A = {0}, B = {1}, C = {2}".format(*array)

Expected Output:

1

'A = 34, B = 66, C = 12'

Example 8:

1

2

3

4

d = {

'hats' : 122,

'mats' : 42

}

Expected Output:

1

"Sam had {hats} hats and {mats} mats".format(**d)

format()  method also supports keywords arguments.

1

'Sam has {red} red balls and {green} yellow balls'.format(red = 12, green = 31)

Note while using keyword arguments we need to use arguments inside {}  not numeric index.

You can also mix position arguments with keywords arguments

 

1

2

'Sam has {red} red balls, {green} yellow balls

and {0} bats'.format(3, red = 12, green = 31)

format()  method of formatting string is quite new and was introduced in python 2.6 . There is another old technique  you will see in legacy codes which allows you to format string using%  operator instead of format()  method.

Let’s take an example.

 

1

"%d pens cost = %.2f" % (12, 150.87612)

Here we are using template string on the left of % . Instead of {} for format codes we are using % . On the right side of % we use tuple to contain our values. %d and %.2f are called as format specifiers, they begin with % followed by character that represents the data type. For e.g %d  format specifier is a placeholder for a integer, similarly %.2f  is a placeholder for floating point number.

So %d  is replaced by the first value of the tuple i.e 12  and %.2f  is replaced by second value i.e 150.87612 .

Expected Output:

 

1

12 pens cost = 150.88

Some more examples

Example 1:

New: "{0:d} {1:d} ".format(12, 31)

Old: "%d %d" % (12, 31)

Expected Output:

1

12 31

Example 2:

New: "{0:.2f} {1:.3f}".format(12.3152, 89.65431)

Old "%.2f %.3f" % (12.3152, 89.65431)

Expected Output:

1

12.32 89.654

Example 3:

New: "{0:s} {1:o} {2:.2f} {3:d}".format("Hello", 71, 45836.12589, 45 )

Old:  "%s %o %.2f %d" % ("Hello", 71, 45836.12589, 45 )

Expected Output:

1

Hello 107 45836.13 45