9.10. String Format MethodΒΆ
Until now, we have created strings with variable content using the + operator to concatenate partial strings together. That works, but itβs very hard for people to read or debug a code line that includes variable names and strings and complex expressions. Consider the following:
Or perhaps more realistically:
In this section, you will learn to write that in a more readable way:
In grade school quizzes a common convention is to use fill-in-the blanks. For instance,
Hello _____!
and you can fill in the name of the person greeted, and combine given text with a chosen
insertion. We use this as an analogy: Python has a similar construction, better called
fill-in-the-braces. The string method format
, makes substitutions into places in a string
enclosed in braces. Run this code:
There are several new ideas here!
The string for the format
method has a special form, with braces embedded.
Such a string is called a format string. Places where
braces are embedded are replaced by the value of an expression
taken from the parameter list for the format
method. There are many
variations on the syntax between the braces. In this case we use
the syntax where the first (and only) location in the string with
braces has a substitution made from the first (and only) parameter.
In the code above, this new string is assigned to the identifier
greeting
, and then the string is printed.
The identifier greeting
was introduced to break the operations into a clearer sequence of
steps. However, since the value of greeting
is only referenced once, it can be eliminated
with the more concise version:
There can be multiple substitutions, with data of any type. Next we use floats. Try original price $2.50 with a 7% discount:
It is important to pass arguments to the format
method in the correct order, because they
are matched positionally into the {}
places for interpolation where there is more than
one.
If you used the data suggested, this result is not satisfying. Prices should appear with exactly two places beyond the decimal point, but that is not the default way to display floats.
Format strings can give further information inside the braces
showing how to specially format data.
In particular floats can be shown with a specific number of decimal places.
For two decimal places, put :.2f
inside the braces for the monetary values:
The 2 in the format modifier can be replaced by another integer to round to that specified number of digits.
This kind of format string depends directly on the order of the parameters to the format method. There are other approaches that we will skip here, such as explicitly numbering substitutions.
It is also important that you give format
the same amount of arguments as there are {}
waiting for interpolation in the string. If you have a {}
in a string that you do not pass arguments for, you may not get an error, but you will see a weird undefined
value you probably did not intend suddenly inserted into your string. You can see an example below.
For example,
A technical point: Since braces have special meaning in a format string, there must be a
special rule if you want braces to actually be included in the final formatted string. The
rule is to double the braces: {β{
and }β}
. For example mathematical set notation uses
braces. The initial and final doubled braces in the format string below generate literal
braces in the formatted string:
a = 5
b = 9
setStr = 'The set is {β{β{}, {}β}β}.'.format(a, b)
print(setStr).
Unfortunately, at the time of this writing, the ActiveCode format implementation has a bug,
printing doubled braces, but standard Python prints {5, 9}
.
- Nothing - it causes an error
- It is legal format syntax: put the data in place of the braces.
- sum of {} and {} is {}; product: {}. 2 6 8 12
- Put the data into the format string; not after it.
- sum of 2 and 6 is 8; product: 12.
- Yes, correct substitutions!
- sum of {2} and {6} is {8}; product: {12}.
- Close: REPLACE the braces.
What is printed by the following statements?
x = 2
y = 6
print('sum of {} and {} is {}; product: {}.'.format( x, y, x+y, x*y))
- 2.34567 2.34567 2.34567
- The numbers before the f in the braces give the number of digits to display after the decimal point.
- 2.3 2.34 2.34567
- Close, but round to the number of digits and display the full number of digits specified.
- 2.3 2.35 2.3456700
- Yes, correct number of digits with rounding!
What is printed by the following statements?
v = 2.34567
print('{:.1f} {:.2f} {:.7f}'.format(v, v, v))