# Python String Formatting

Updated on Jan 07, 2020

The 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:

>>> '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 of format() i.e 12, while {1} is replaced by the second argument of format() i.e 31.

Expected Output:

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]}

The 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:

>>> "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:

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:

Floating point 3.142


Example 3:

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


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

Expected Output:

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:

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


Expected Output:

Sam has 31 red balls and 12 yellow balls


Example 6:

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


Expected Output:

In binary 4 is 100


Example 7:

 1 2 array = [34, 66, 12] "A = {0}, B = {1}, C = {2}".format(*array) 

Expected Output:

A = 34, B = 66, C = 12


Example 8:

 1 2 3 4 5 6 d = { 'hats' : 122, 'mats' : 42 } "Sam had {hats} hats and {mats} mats".format(**d) 

Expected Output:

Sam had 122 hats and 42 mats


The format() method also supports keywords arguments.

'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) 

The 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.

"%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:

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:

12 31


Example 2:

New:

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


Old:

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


Expected Output:

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:

Hello 107 45836.13 45