'What's the difference between %s and %d in Python string formatting?
I don't understand what %s
and %d
do and how they work.
Solution 1:[1]
They are used for formatting strings. %s
acts a placeholder for a string while %d
acts as a placeholder for a number. Their associated values are passed in via a tuple using the %
operator.
name = 'marcog'
number = 42
print '%s %d' % (name, number)
will print marcog 42
. Note that name is a string (%s) and number is an integer (%d for decimal).
See https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting for details.
In Python 3 the example would be:
print('%s %d' % (name, number))
Solution 2:[2]
from python 3 doc
%d
is for decimal integer
%s
is for generic string or object and in case of object, it will be converted to string
Consider the following code
name ='giacomo'
number = 4.3
print('%s %s %d %f %g' % (name, number, number, number, number))
the out put will be
giacomo 4.3 4 4.300000 4.3
as you can see %d
will truncate to integer, %s
will maintain formatting, %f
will print as float and %g
is used for generic number
obviously
print('%d' % (name))
will generate an exception; you cannot convert string to number
Solution 3:[3]
%s
is used as a placeholder for string values you want to inject into a formatted string.
%d
is used as a placeholder for numeric or decimal values.
For example (for python 3)
print ('%s is %d years old' % ('Joe', 42))
Would output
Joe is 42 years old
Solution 4:[4]
These are all informative answers, but none are quite getting at the core of what the difference is between %s
and %d
.
%s
tells the formatter to call the str()
function on the argument and since we are coercing to a string by definition, %s
is essentially just performing str(arg)
.
%d
on the other hand, is calling int()
on the argument before calling str()
, like str(int(arg))
, This will cause int
coercion as well as str
coercion.
For example, I can convert a hex value to decimal,
>>> '%d' % 0x15
'21'
or truncate a float.
>>> '%d' % 34.5
'34'
But the operation will raise an exception if the argument isn't a number.
>>> '%d' % 'thirteen'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %d format: a number is required, not str
So if the intent is just to call str(arg)
, then %s
is sufficient, but if you need extra formatting (like formatting float decimal places) or other coercion, then the other format symbols are needed.
With the f-string
notation, when you leave the formatter out, the default is str
.
>>> a = 1
>>> f'{a}'
'1'
>>> f'{a:d}'
'1'
>>> a = '1'
>>> f'{a:d}'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Unknown format code 'd' for object of type 'str'
The same is true with string.format
; the default is str
.
>>> a = 1
>>> '{}'.format(a)
'1'
>>> '{!s}'.format(a)
'1'
>>> '{:d}'.format(a)
'1'
Solution 5:[5]
These are placeholders:
For example: 'Hi %s I have %d donuts' %('Alice', 42)
This line of code will substitute %s with Alice (str) and %d with 42.
Output: 'Hi Alice I have 42 donuts'
This could be achieved with a "+" most of the time. To gain a deeper understanding to your question, you may want to check {} / .format() as well. Here is one example: Python string formatting: % vs. .format
also see here a google python tutorial video @ 40', it has some explanations https://www.youtube.com/watch?v=tKTZoB2Vjuk
Solution 6:[6]
The %d
and %s
string formatting "commands" are used to format strings. The %d
is for numbers, and %s
is for strings.
For an example:
print("%s" % "hi")
and
print("%d" % 34.6)
To pass multiple arguments:
print("%s %s %s%d" % ("hi", "there", "user", 123456))
will return hi there user123456
Solution 7:[7]
%d
and %s
are placeholders, they work as a replaceable variable. For example, if you create 2 variables
variable_one = "Stackoverflow"
variable_two = 45
you can assign those variables to a sentence in a string using a tuple of the variables.
variable_3 = "I was searching for an answer in %s and found more than %d answers to my question"
Note that %s
works for String and %d
work for numerical or decimal variables.
if you print variable_3
it would look like this
print(variable_3 % (variable_one, variable_two))
I was searching for an answer in StackOverflow and found more than 45 answers to my question.
Solution 8:[8]
They are format specifiers. They are used when you want to include the value of your Python expressions into strings, with a specific format enforced.
See Dive into Python for a relatively detailed introduction.
Solution 9:[9]
As per latest standards, this is how it should be done.
print("My name is {!s} and my number is{:d}".format("Agnel Vishal",100))
Do check python3.6 docs and sample program
Solution 10:[10]
%s is used to hold space for string %d is used to hold space for number
name = "Moses";
age = 23
print("My name is %s am CEO at MoTech Computers " %name)
print("Current am %d years old" %age)
print("So Am %s and am %d years old" %(name,age))
this video goes deep about that tip https://www.youtube.com/watch?v=4zN5YsuiqMA
Solution 11:[11]
In case you would like to avoid %s or %d then..
name = 'marcog'
number = 42
print ('my name is',name,'and my age is:', number)
Output:
my name is marcog and my name is 42
Solution 12:[12]
speaking of which ...
python3.6 comes with f-strings
which makes things much easier in formatting!
now if your python version is greater than 3.6 you can format your strings with these available methods:
name = "python"
print ("i code with %s" %name) # with help of older method
print ("i code with {0}".format(name)) # with help of format
print (f"i code with {name}") # with help of f-strings
Solution 13:[13]
Here is the basic example to demonstrate the Python string formatting and a new way to do it.
my_word = 'epic'
my_number = 1
print('The %s number is %d.' % (my_word, my_number)) # traditional substitution with % operator
//The epic number is 1.
print(f'The {my_word} number is {my_number}.') # newer format string style
//The epic number is 1.
Both prints the same.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow