要在Python中把一个数字或字符串转换(格式化)为各种格式,可以使用内置函数format()或字符串方法str.format()。
在本节中,我们将解释如何使用以下函数。
- 内置函数
format()
- 字串方法
str.format()
此外,还用示例代码解释了转换为以下格式的格式规范字符串。
- 左对齐,中间对齐,右对齐
- 零填充
- 符号(加号或减号)
- 数字分隔符(逗号、下划线)。
- 二进制、八进制和十六进制数字
- 指定小数点后的位数
- 有效数字(有效数字的数量)。
- 指数记号
- 百分比显示
注意,从Python 3.6开始,字符串方法str.format()中加入了f-字符串(f-strings),使其更加简明。
内置函数:format()
format()是作为一个标准的Python内置函数提供的。
大纲如下。
format(value, format_spec)
- 第一个参数:
value
原始值。字符串str,数字int,float,等等。 - 第二个参数
format_spec
格式规范字符串。字符串str - 返回值:一个格式化的字符串str
- 第一个参数:
下面是一些例子。格式化字符串的类型以及如何编写这些字符串将在后面介绍。
在这个例子中,我们使用了数字字面和字符串字面作为第一个参数,当然,你也可以使用包含这些值的变量。
s = format(255, '04x')
print(s)
print(type(s))
# 00ff
# <class 'str'>
print(format('center', '*^16'))
# *****center*****
字符串方法 str.format()
还有一个format()方法用于字符串str类型。
调用format()方法的字符串str中的{}被称为替换字段,并被format()方法的参数所替换。
格式规范字符串应写在替换字段{}中,后面是”:”。
返回值是一个格式化的字符串str。
与上述内置函数format()相当的过程如下。
s = '{:04x}'.format(255)
print(s)
print(type(s))
# 00ff
# <class 'str'>
print('{:*^16}'.format('center'))
# *****center*****
同样,我们使用数字字头和字符串字头作为参数,当然,变量也是可以接受的。
为替换字段指定参数
按顺序指定参数(默认)。
可以有多个替换字段{},默认情况下,方法参数是按顺序处理的。如果{}中的格式规范字符串被省略,它将只是被str()转换为一个字符串。
有助于在字符串中插入变量值并打印它们。
print('{}-{}-{}'.format('100', '二百', 300))
# 100-二百-300
为整数值指定一个位置参数
如果在{}中指定了一个整数值,如{0}或{1},输出将取决于参数的顺序。同一数字可以重复使用。当你想在一个字符串中插入相同的值时,这很有用。
print('{0}-{1}-{0}'.format('foo', 'bar'))
# foo-bar-foo
为任意的名字(字符串)指定关键词参数
你也可以在{}中指定任何名称,并将其作为一个关键词参数输入。
print('{day}/{month}/{year}/'.format(day=11, month=1, year=2018))
# 11/1/2018
指定一个列表或字典作为参数
列表和字典可以被指定为参数。
使用[]来指定一个列表的索引或替换字段中的字典的键。注意,引号”'”和””不能用来指定字典的键。
如果你想重复使用同一个参数,你需要指定一个整数值或一个字符串(名称),如上所述。
l = ['one', 'two', 'three']
print('{0[0]}-{0[1]}-{0[2]}'.format(l))
# one-two-three
d1 = {'name': 'Alice', 'age': 20}
d2 = {'name': 'Bob', 'age': 30}
print('{0[name]} is {0[age]} years old.\n{1[name]} is {1[age]} years old.'.format(d1, d2))
# Alice is 20 years old.
# Bob is 30 years old.
它可以作为一个位置参数被扩展,方法是将*附加到列表中并将其指定为一个参数,或者作为一个关键字参数,将**附加到字典中并将其指定为一个参数。
l = ['one', 'two', 'three']
print('{}-{}-{}'.format(*l))
# one-two-three
d = {'name': 'Alice', 'age': 20}
print('{name} is {age} years old.'.format(**d))
# Alice is 20 years old.
大括号{}的描述
如果你想在format()方法中写上大括号{,},请重复两次,如{{,}}。注意,反斜线不能被转义。
print('{{}}-{num}-{{{num}}}'.format(num=100))
# {}-100-{100}
格式化的字符串
在这两种情况下,为了指定格式,在{}中的整数值或名称字符串后面写上”:格式字符串”。
print('{num:x}'.format(num=255))
# ff
print('{day}/{month:02}/{year:02}/'.format(day=11, month=1, year=2018))
# 11/01/2018
在下文中,我们将解释如何使用格式字符串来指定格式。示例代码使用了字符串方法str.format(),但同样的格式字符串也可以用内置函数format()来使用。在内置函数format()中,格式规范字符串被指定为第二个参数。
左对齐,中间对齐,右对齐
你可以在下面进行左对齐、中间对齐、右对齐等。以数字形式指定总的字符数。
<
^
>
print('left : {:<10}'.format(100))
print('center: {:^10}'.format(100))
print('right : {:>10}'.format(100))
# left : 100
# center: 100
# right : 100
你也可以指定一个要填入的字符。如果省略,如上面的例子,它就是一个空格。
你可以使用双字节的字符,只要它是一个单字符。
print('left : {:*<10}'.format(100))
print('center: {:a^10}'.format(100))
print('right : {:鬼>10}'.format(100))
# left : 100*******
# center: aaa100aaaa
# right : 鬼鬼鬼鬼鬼鬼鬼100
用>进行右对齐时,不考虑符号(-,+)。如果你使用=,符号后面会有指定的字符。如果你想指定+,在=后面写+。
print('sign: {:0>10}'.format(-100))
print('sign: {:0=10}'.format(-100))
print('sign: {:0=+10}'.format(100))
# sign: 000000-100
# sign: -000000100
# sign: +000000100
<、^和>可以指定用于字符串,但=会导致ValueError错误。如果你想对一个字符串使用=,你需要用int()将其转换为数字。
# print('sign: {:0=10}'.format('-100'))
# ValueError: '=' alignment not allowed in string format specifier
print('sign: {:0=10}'.format(int('-100')))
# sign: -000000100
这同样适用于浮点数。小数点也被算作一个字符。
print('left : {:*<10}'.format(1.23))
print('center: {:a^10}'.format(1.23))
print('right : {:鬼>10}'.format(1.23))
# left : 1.23******
# center: aaa1.23aaa
# right : 鬼鬼鬼鬼鬼鬼1.23
print('sign: {:0>10}'.format(-1.23))
print('sign: {:0=10}'.format(-1.23))
print('sign: {:0=+10}'.format(1.23))
# sign: 00000-1.23
# sign: -000001.23
# sign: +000001.23
列表、图元等如果按原样指定会导致错误,可以用str()转换为字符串。
l = [0, 1]
print(type(l))
# <class 'list'>
# print('{:*^16}'.format(l))
# TypeError: unsupported format string passed to list.__format__
print(type(str(l)))
# <class 'str'>
print('{:*^16}'.format(str(l)))
# *****[0, 1]*****
对于左对齐、居中对齐和右对齐,也有专门的字符串方法,称为ljust()、center()和rjust()。
0 填补
如果你想通过填零来调整数字的数量,请将要填的字符设置为0,并将其右对齐。
在零填充的情况下,如果省略了对齐符号,就会像指定=一样处理。
print('zero padding: {:0=10}'.format(100))
print('zero padding: {:010}'.format(100))
# zero padding: 0000000100
# zero padding: 0000000100
print('zero padding: {:0=10}'.format(-100))
print('zero padding: {:010}'.format(-100))
# zero padding: -000000100
# zero padding: -000000100
=如果你指定一个字符串作为参数,如上所述,你会得到一个错误。我们要小心。
# print('zero padding: {:010}'.format('-100'))
# ValueError: '=' alignment not allowed in string format specifier
对于零填充,也有一个专门的字符串方法,叫做zfill()。
符号(加号或减号)
默认情况下,只有负数才会用符号(minus-)标记。
当+被添加到格式化规范字符串中时,对于正数也会显示一个符号(加+)。如果添加了空格,正数的开头会显示一个空格,位数会与负数对齐。
print('sign: {}'.format(100))
print('sign: {}'.format(-100))
# sign: 100
# sign: -100
print('sign: {:+}'.format(100))
print('sign: {:+}'.format(-100))
# sign: +100
# sign: -100
print('sign: {: }'.format(100))
print('sign: {: }'.format(-100))
# sign: 100
# sign: -100
在用任意字符填充时要小心,比如上面提到的零填充。默认情况下,没有+和空格,用多一个字符来填充正数。
print('sign: {:06}'.format(100))
print('sign: {:06}'.format(-100))
# sign: 000100
# sign: -00100
print('sign: {:+06}'.format(100))
print('sign: {:+06}'.format(-100))
# sign: +00100
# sign: -00100
print('sign: {: 06}'.format(100))
print('sign: {: 06}'.format(-100))
# sign: 00100
# sign: -00100
如果使用对齐符号,则应将符号指定符号写在对齐符号之后。
print('sign: {:_>6}'.format(100))
print('sign: {:_>6}'.format(-100))
# sign: ___100
# sign: __-100
print('sign: {:_>+6}'.format(100))
print('sign: {:_>+6}'.format(-100))
# sign: __+100
# sign: __-100
print('sign: {:_> 6}'.format(100))
print('sign: {:_> 6}'.format(-100))
# sign: __ 100
# sign: __-100
数字分隔符(逗号、下划线)。
每三个数字加一个逗号或下划线_分隔符。这使得大数字更容易阅读。注意underscore_是Python 3.6中添加的选项,所以它不能在早期版本中使用。
print('{:,}'.format(100000000))
# 100,000,000
print('{:_}'.format(100000000))
# 100_000_000
如果是浮点数的浮动类型,只有整数部分被划定。
print('{:,}'.format(1234.56789))
# 1,234.56789
二进制、八进制和十六进制数字
将数值转换为二进制、八进制和十六进制的数字进行输出。
b
: 二进制o
: 八进制d
: 小数x
,X
: 十六进制(大写字母为大写)。
print('bin: {:b}'.format(255))
print('oct: {:o}'.format(255))
print('dec: {:d}'.format(255))
print('hex: {:x}'.format(255))
print('HEX: {:X}'.format(255))
# bin: 11111111
# oct: 377
# dec: 255
# hex: ff
# HEX: FF
它也可以与0-fill结合使用,并经常被用来对齐二进制和十六进制符号中的数字。
print('bin: {:08b}'.format(255))
print('oct: {:08o}'.format(255))
print('dec: {:08d}'.format(255))
print('hex: {:08x}'.format(255))
print('HEX: {:08X}'.format(255))
# bin: 11111111
# oct: 00000377
# dec: 00000255
# hex: 000000ff
# HEX: 000000FF
请注意,必须在考虑到前缀的情况下指定零填充字符的数量。
print('bin: {:#010b}'.format(255))
print('oct: {:#010o}'.format(255))
print('dec: {:#010d}'.format(255))
print('hex: {:#010x}'.format(255))
print('HEX: {:#010X}'.format(255))
# bin: 0b11111111
# oct: 0o00000377
# dec: 0000000255
# hex: 0x000000ff
# HEX: 0X000000FF
对于二进制和十六进制的数字,只能插入下划线_数字分隔符(Python 3.6或更高版本)。使用4位数分隔符;填零字符的数量也必须考虑到下划线的数量。
print('hex: {:08x}'.format(255))
print('hex: {:09_x}'.format(255))
print('hex: {:#011_x}'.format(255))
# hex: 000000ff
# hex: 0000_00ff
# hex: 0x0000_00ff
只有整数类型int可以将格式转换为二进制或十六进制。你可以使用int()将其转换为数字。
# print('hex: {:08x}'.format('255'))
# ValueError: Unknown format code 'X' for object of type 'str'
print('hex: {:08x}'.format(int('255')))
# hex: 000000ff
指定小数点后的位数
要指定小数点后的数字,请按以下步骤操作: n是数字的数量。小数点后的位数成为指定的位数,与整数部分的位数无关。.[n]f
print('{:.2f}'.format(123.456))
print('{:.5f}'.format(123.456))
print('{:.3f}'.format(0.0001234))
# 123.46
# 123.45600
# 0.000
小数点的左侧可以指定为左对齐、居中对齐、右对齐,或如上所述的零填充。如果目标值的位数多于指定的数字,则不做任何操作。如果目标值的位数大于指定的位数,则不做任何操作。
print('{:>12.5f}'.format(123.456))
print('{:012.5f}'.format(123.456))
print('{:06.5f}'.format(123.456))
# 123.45600
# 000123.45600
# 123.45600
如果你指定的数字少于小数点后的原始数字,该值将被四舍五入。请注意,这不是四舍五入到最接近的整数,而是四舍五入到偶数,例如,0.5被四舍五入到0。
print('{:.0f}'.format(0.4))
print('{:.0f}'.format(0.5))
print('{:.0f}'.format(0.6))
# 0
# 0
# 1
如果你想使用一般的四舍五入,你可以使用标准库十进制的quantize()方法。
指数记号
当一个浮点数被转换为字符串str时,它将根据数字的多少自动写成指数符号。整数类型int则不然。
print('{}'.format(0.0001234))
print('{}'.format(0.00001234))
# 0.0001234
# 1.234e-05
print('{}'.format(1234000000000000.0))
print('{}'.format(12340000000000000.0))
print('{}'.format(12340000000000000000000000))
# 1234000000000000.0
# 1.234e+16
# 12340000000000000000000000
如果你在格式化规范字符串中指定e或E,你可以随时转换为指数符号。输出中使用的字符将分别为e和E。
print('{:e}'.format(0.0001234))
print('{:E}'.format(0.0001234))
# 1.234000e-04
# 1.234000E-04
也可以指定小数点后的位数。整数部分将始终是一位数,小数点将是指定的数字数。
print('{:.5e}'.format(0.0001234))
print('{:.2E}'.format(0.0001234))
# 1.23400e-04
# 1.23E-04
print('{:.5e}'.format(987.65))
print('{:.2E}'.format(987.65))
# 9.87650e+02
# 9.88E+02
请注意,如果你指定左对齐、居中对齐、右对齐或零填充,e-、E+等也将被算作数字(字符)。
print('{:>12.5e}'.format(987.65))
print('{:012.2E}'.format(987.65))
# 9.87650e+02
# 00009.88E+02
有效数字(有效数字的数量)。
你可以通过以下方式指定总位数 根据结果,将自动使用指数符号。注意,小数点后的尾数零将被省略。.[n]g
print('{:.2g}'.format(123.456))
print('{:.3g}'.format(123.456))
print('{:.8g}'.format(123.456))
print('{:.3g}'.format(0.0001234))
# 1.2e+02
# 123
# 123.456
# 0.000123
如果你省略了g,输出将不是一个整数。g在大多数情况下是一样的,但只有在输出是一个整数的情况下。
print('{:.2}'.format(123.456))
print('{:.3}'.format(123.456))
print('{:.8}'.format(123.456))
print('{:.3}'.format(0.0001234))
# 1.2e+02
# 1.23e+02
# 123.456
# 0.000123
如果我们处理相同的值,我们分别得到以下结果。
print('{:.3f}'.format(123.456))
print('{:.3e}'.format(123.456))
print('{:.3g}'.format(123.456))
print('{:.3}'.format(123.456))
# 123.456
# 1.235e+02
# 123
# 1.23e+02
print('{:.8f}'.format(123.456))
print('{:.8e}'.format(123.456))
print('{:.8g}'.format(123.456))
print('{:.8}'.format(123.456))
# 123.45600000
# 1.23456000e+02
# 123.456
# 123.456
在g的情况下,或者如果省略了它,小数点后的尾部零会被省略,所以如果你想输出相同数量的有效数字(有效数字的数量),使用e或E的指数符号,整数部分总是一个数字,小数点是指定的数字,所以如果你想输出n个有效数字,只需要指定n-1。
print('{:.4e}'.format(123.456))
print('{:.4e}'.format(0.000012345))
print('{:.4e}'.format(12))
# 1.2346e+02
# 1.2345e-05
# 1.2000e+01
百分比显示
如果在格式化规范字符串中指定了%,那么数字浮点数或int的值就会乘以100,然后用%转换为字符串。
也可以指定小数点后的数字。默认是小数点后的六位数。还可以进行左对齐、居中对齐、右对齐和填零。%也被算作一个字符。
print('{:%}'.format(0.12345))
print('{:.2%}'.format(0.12345))
# 12.345000%
# 12.35%
print('{:%}'.format(10))
print('{:.2%}'.format(10))
# 1000.000000%
# 1000.00%
print('{:>7.2%}'.format(0.12345))
print('{:07.2%}'.format(0.12345))
# 12.35%
# 012.35%