格式化字符串 f-string 格式化说明符 format specifier
概述
python支持多种格式化字符串方式,包括%-formatting
,str.format()
,string.Template
。PEP 498提议了一个新的字符串格式化机制:Literal String Interpolation。使用这一机制的字符串就是“f-strings”。
%-formatting
支持数据类型有限,且使用中可能出错。【error prone】
%-formatting
和string.Template
一些格式化无法实现。如string.Template
无法实现下面的格式化效果:
value = 1234
print(f'input={value:#06x}')
# 'input=0x04d2'
%-formatting
和 string.Template
都不能实现下面的格式化:
date = datetime.date(1991, 10, 12)
print(f'{date} was on a {date:%A}')
# '1991-10-12 was on a Saturday'
str.format()
不会出现上述问题,不过它的主要毛病是冗长。【verbosity】
所以PEP 498推荐使用f-strings
。
F-strings provide a concise, readable way to include the value of Python expressions inside strings.
F-strings提供了一种简洁、可读的方式来将Python表达式的值包含在字符串中。
使用
Python格式化字符串f-string常用用法_python f-string_皓月盈江的博客-CSDN博客
格式化描述符
format specifier。使用方式f'{值 : 格式化描述符}'
。格式化描述符的格式为,
[[fill]align][sign][#][0][minimumwidth][.precision][type]
,[]里的内容为可选。
[minimumwidth]
和[precision]
全部是十进制数,分别表示字段的最小宽度和浮点数的精度。
value = 3.1415926535
print(f'value = {value:10}') # [minimumwidth] 注意:最小宽度
# value = 3.1415926535
print(f'value = {value:.4f}') # [.precision][type]
# value = 3.1416
print(f'value = {value:10.4f}') # [minimumwidth][.precision][type] 默认空格填充
# value = 3.1416
print(f'value = {value:010.4f}') # [0][minimumwidth][.precision][type]
# value = 00003.1416
[[fill]align]对齐
作用 | |
---|---|
< | 左对齐 |
> | 右对齐 |
^ | 居中对齐 |
= | 仅对数字使用 |
注意:除非定义了最小宽度字段,否则字段宽度将始终与填充它的数据大小相同,因此在这种情况下对齐选项没有意义。
当设置最小宽度字段之后,字符默认是左对齐,数值默认是右对齐
[fill]
字段必须在[align]
字段设置后才可启用,不能单独设置。默认填充空格,也可以填充任意字符。填充0时的作用效果和后面直接使用[0]
字段一样。
=
的作用使[fill]
字段填充的字符显示数字前。主要是用于显示如,‘+000000120’,这样的数字。
for i in range(5):
print(f'{10 ** i:0>+6}') # [[fill]align][sign][minimumwidth]
print()
for i in range(5):
print(f'{10 ** i:0=+6}') # [[fill]align][sign][minimumwidth]
其实使用[0]
,可以实现相同效果。
for i in range(5):
print(f'{10 ** i:+06}') #[sign][0][minimumwidth]
If the width field is preceded by a zero (‘0’) character, this enables zero-padding. This is equivalent to an alignment type of ‘=’ and a fill character of ‘0’.
如果宽度字段前面有一个零(’ 0 ‘)字符,这将启用零填充。这相当于对齐类型为’ = ‘和填充字符为’ 0 '。
[sign]正负号
作用 | |
---|---|
’+‘ | 正数加正号 |
’-’ | 正数不显示正号,默认 |
‘ ’ | 正数前显示空格 |
negative = -200
positive = 2
print(f'负数:{negative:<4}')
print(f'默认:{positive:<4}')
print(f'负号:{positive:<-4}')
print(f'正号:{positive:<+4}')
print(f'空格:{positive:< 4}')
'''
负数:-200
默认:2
负号:2
正号:+2
空格: 2
'''
[type]类型
整数类型
作用 | |
---|---|
‘b’ | 转化为二进制 |
‘c’ | 将数字转换成对应的unicode字符 |
‘d’ | 十进制 |
‘o’ | 转化为八进制 |
‘x’ | 转化为十六进制,用小写字母a,b,c,d,e,f表示9-15 |
‘X’ | 转化为十六进制,用大写字母A,B,C,D,E,F表示9-15 |
‘n’ | 根据本地化设置插入数字分隔符 |
num = 28
print(f'{num:d}') # 28
print(f'{num:b}') # 11100
print(f'{num:o}') # 34
print(f'{num:x}') # 1c
print(f'{num:X}') # 1C
关于'n'
:与’d’相同,不同之处在于它使用当前区域设置来插入适当的数字分隔符。如我们使用1000直接这样,而一些地区会这样1,000来展示。
num2 = 10000
print(f'{num2:n}') # 10000
print(f'{num2:,}') # 10,000
import locale
# 设置当前的本地化设置为美国
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
number = 1234567890
formatted_number = f"{number:n}"
print(formatted_number) # 1,234,567,890
浮点数类型
作用 | |
---|---|
‘e’ | 使用科学计数法,用e来指明指数 |
‘E’ | 使用科学计数法,用E来指明指数 |
‘f’ | 定点数格式,默认精度为6 |
‘F’ | 同上,不过将inf和nan表示为INF和NAN |
‘n’ | 同g ,不过会根据地区使用分隔符 |
‘%’ | 百分数,当前数字*100,加上%,小数部分按照f 显示 |
ff = 3141.5926535
print(f'{ff:e}') # 3.141593e+03
print(f'{ff:E}') # 3.141593E+03
ff=3
print(f'{ff:f}') # 3.000000
print(f'{ff:F}') # 3.000000
x = 3.14
print(f'{x:%}') # 314.000000%
通用
作用 | |
---|---|
‘g’ | 通用格式。小数同f ,d ,大数同e 。 |
‘G’ | 通用格式。小数同F ,d ,大数同’E’。 |
''None | 同'g' ,不同之处在于遇见如3.00这类数字 |
ff=30000000000000000000000
print(f'{ff:g}') # 3e+22
print(f'{ff:G}') # 3E+22
print(f'{ff}') # 30000000000000000000000
ff=3.00
print(f'{ff:g}') # 3
print(f'{ff:G}') # 3
print(f'{ff}') # 3.0
[#]
如果存在’ # ‘字符,则整数使用’ alternate form ‘进行格式化。这意味着二进制、八进制和十六进制输出将分别以’ 0b ‘、’ 00 ‘和’ 0x '作为前缀。
num = 28
print(f'{num:#b}')
# 0b11100
参考资料
PEP 498 – Literal String Interpolation | peps.python.org