字符串格式化处理
远古写法
以前通常使用运算符号 % ,%s 插入的值 String 类型,%.3f 指插入的值为包含 3 位小数的浮点数:
- format1 = "%s, %s!" % ('Hello', 'World')
- # 'Hello, World!'
关键字插入法:
- temp = string.Template('I am $name, I like $what!;)
- temp.substitute(name='Liang', what='Apple')
- # 'I am Liang, I like Apple!'
Python 3 推荐方法
新版本 Python 中, 应选择使用字符串方法 format, 每个替换字段都用 {} 大括号 (花括号) 括起, 括号内可留空或添加格式设置信息:
一般用法:
- 'I am {},I like {}'.format('Liang', 'Apple')
- # 'I am Liang, I like Apple!'
- 'I am {0},I like {1}'.format('Liang', 'Apple')
- # 'I am Liang, I like Apple!'
索引也可无需像上面一样顺序排列, 但注意不能同时使用自动索引和手工索引:
- 'I am {1},I like {0}'.format('Apple', 'Liang')
- # 'I am Liang, I like Apple!'
更可以像上面关键字插入法一样, 给每个替换字段命名, 名称后面跟冒号可以设置格式:
- '{name} is {value:.2f},'.format(name='π', value=pi)
- # 'π is 3.14'
终极简约写法, 在字符串前面加上 f, 便可直接将值或变量写在大括号内:
- f"{'π'} is {pi:.2f}"
- # 'π is 3.14'
如果输出结果中需要包含大括号, 则可使用两个大括号来指定:
- "{{我需要使用 {what} 啊!}}".format(what='大括号')
- # {
- 我需要使用大括号啊!
- }
关键字插入法可以和索引同时使用:
- '{foo} {1} {bar} {0}'.format(1, 2, foo=3, bar=4)
- # '3 1 2 4'
基本转换
指定占位符要转换的类型;
例如, 你可以提供一个整数, 但将其作为小数进行处理:
- num = 1024
- f'The number is {num:f}'
- # 'The number is 1024.000000'
亦或者将其作为二进制处理:
- num = 1024
- f'The number is {num:b}'
- # 'The number is 10000000000'
以下为字符串格式设置类型说明符:
说明符 | 含义 |
---|---|
b | 将整数表示为二进制 |
c | 将整数解读为 Unicode 码点 |
d | 将整数视为十进制数进行处理,这是整数默认使用的说明符 |
e | 使用科学表示法来表示小数(用 e 来表示指数) |
E | 与 e 相同,但使用 E 来表示指数 |
f | 将小数表示为定点数 |
F | 与 f 相同,但与特殊值(nan 和 inf),使用大写表示 |
g | 自动在定点表示法和科学表示法之间做选择。这是默认用于小数的说明符,但在默认情况下至少有 1 位小数 |
G | 与 g 相同,但使用大写来表示指数和特殊值 |
n | 与 g 相同,但插入随区域而异的数字分隔符 |
o | 将整数表示为八进制数 |
s | 保持字符串的格式不变,这是默认用于字符串的说明符 |
x | 将整数表示为十六进制数并使用小写字母 |
X | 与 X 相同,但使用大写字母 |
% | 将数表示为百分比值(乘以 100,按说明符 f 的设置格式,再在后面加上 %) |
宽度, 精度和千位分隔符
在字符串格式化处理是, 不但可以转换类型, 还可以设置转换字段的宽度和精度;
宽度使用整数表示:
- num = 1024
- f'{num:10}'
- # '1024'
数字和字符串的默认对齐方式不同:
- num = '1024'
- f'{num:10}'
- # '1024'
精度也是使用整数表示, 但需要在整数前加上小数点:
- num = 1024
- f'{num:.2f}'
- # '1024.00'
宽度可以和精度同时指定:
- num = 1024
- f'{num:10.2f}'
- # '1024.00'
字符串类型也可以指定精度, 但不推荐使用, 使用切片处理则更好理解:
- str = '今天天气不错~'
- f'{str:.2}'
- # '今天'
在冒号后面添加一个逗号可以为数值添加千位分隔符:
- num = 10000000000000
- f'{num:,}'
- # '10,000,000,000,000'
填充, 对齐与符号
在不添加对齐符号 (使用默认对齐方式) 的情况下, 尽可以使用 0 进行有意义的填充操作:
- num = 1024
- f'{num:010}'
- # '0000001024'
但是在添加了对齐符号之后, 就可以在对齐符号前面任意添加一个字符表示填充字符了;
对齐符号:<(左对齐),>(右对齐),^(居中), 写在宽度之前:
- num = 1024
- f'{num:<10}'
- '1024'
- f'{num:^10}'
- '1024'
- f'{num:>10}'
- '1024'
当替换字段为数值时, 可为替换字段添加正负符号,
添加 + 符号时, 加号写在对齐符号之后, 宽度整数之前;
添加 - 符号时, 减号写在替换字段的之前;
可以理解为将替换字段的数值乘以 +1(将 + 显示)或 -1 :
- num = 1024
- f'{num:>+10}'
- '+1024'
- f'{-num:>10}'
- '-1024'
如果需要为负数添加符号:
- num = -1024
- f'{num:>10}'
- '-1024'
- f'{-num:>+10}'
- '+1024'
= 是一种添加了正负符号之后的另一种对齐符号(可以理解为 两端对齐), 作用是将填充字符放在符号和数字之间:
- num = 1024
- f'{num:=+10}'
- '+ 1024'
- f'{-num:=10}'
- '- 1024'
总结
'{[0]sum[1][2][3][4][5]}'
0: 为替换字段添加 - 符号(替换字段须为数字且不为负数, 因为负数无需再多此一举);
1: 为替换字段指定宽度之后可以在此位置指定填充字符, 默认为空格;
2: 为替换字段指定宽度之后可以在此位置指定对齐符号,<(左对齐) / ^(居中) />(右对齐) / =(两端对齐, 只能用于类型为数值切有正负符号的替换字段);
3: 为替换字段添加 + 符号(替换字段须为数字);
4: 指定替换字段的宽度, 只能填写整数;
5: 指定替换字段的精度或转换类型;
来源: https://www.cnblogs.com/Light-/p/11337257.html