python3中f-string 格式化固定宽度的数字
2019-11-30 本文已影响0人
曹建峰
书接上回
看到工程师李蕾能用一行命令,更新flutter工程下所有图标,
韩梅梅深刻的体会到,这(zhe)门(ge)语(nan)言(ren)如此优秀,一定不能错过。
于是找到李蕾:
韩梅梅:“李蕾,上次见到你用python更新图标,感觉好棒啊”
李蕾:“Python确实是很好用的”
韩梅梅:“我能学会吗”
李蕾:“有我在,怎么可能学不会呢?我们先从最简单的Hello world开始吧”
......
如切如磋,如琢如磨
经过一通折腾,韩梅梅望着屏幕有些不满
第1次 Hello world
第2次 Hello world
...
第8次 Hello world
第9次 Hello world
第10次 Hello world
第11次 Hello world
第12次 Hello world
韩梅梅:“怎么不齐呢,好心塞”
李蕾:“别担心,刚才我们用的f-string,它提供了固定宽度的格式化方法,只要在需要固定宽度的变量后面加上冒号和代表宽度数字就可以了。”
修改前
def without_fix(base_index):
i = 0
while i < ROW_COUNT:
print(f'第{base_index+i}次 Hello world')
i += 1
修改后
def with_fix2(base_index):
i = 0
while i < ROW_COUNT:
print(f'第{base_index+i:2}次 Hello world with_fix2({base_index})')
i += 1
运行结果:
...
第 8次 Hello world with_fix2(8)
第 9次 Hello world with_fix2(8)
第10次 Hello world with_fix2(8)
第11次 Hello world with_fix2(8)
第12次 Hello world with_fix2(8)
第13次 Hello world with_fix2(8)
...
韩梅梅:“这个 ‘第 8次’里面8前面空了个位置,8又不能居中,好心塞”
百尺竿头 更进一步
韩大设计师的心,真的是,很容易塞啊。
不过,这难不倒李蕾,经过一番努力终于满足了韩梅梅。
第08次 Hello world with_fix02(8)
第09次 Hello world with_fix02(8)
第10次 Hello world with_fix02(8)
第11次 Hello world with_fix02(8)
第12次 Hello world with_fix02(8)
第13次 Hello world with_fix02(8)
韩梅梅:“舒服,蕾哥好棒,你是怎么做到的”
李蕾:“你看看我改的地方就明白了,第{base_index+i:02}次里面的0代表用0填充空位。”
print(f'第{base_index+i:02}次 Hello world with_fix02({base_index})')
乘胜追击 穷追猛打
其实我们还可以做的更好。让python自己判断最大宽度是多大。
def with_auto_fix(base_index):
MAX_NUM = base_index+ROW_COUNT
MAX_WIDTH = len(f"{MAX_NUM}")
i = 0
while i < ROW_COUNT:
print(f'第{base_index+i:0{MAX_WIDTH}}次 Hello world with_auto_fix({base_index})')
i += 1
没错,f-string 里的宽度可以用变量替代
多亏平时学的扎实,凭借对之前看过的f-string官方文档的记忆,
李蕾又为韩梅梅展示了f-string 固定宽度的进阶用法
def fix_float():
percent = .01987654321
print(f"{percent:010.3%}\t-浮点数-保留3位小数位百分比,固定宽度10")
print(f"{percent:010.3f}\t-浮点数-固定宽度10,保留3位小数")
print(f"{percent:010.5f}\t-浮点数-固定宽度10,保留5位小数")
print(f"{1.1:010.5f}\t-浮点数-固定宽度10,保留5位小数")
看到各种输出都能变得干净整齐,韩梅梅终于心情舒畅了。
00001.988% -浮点数-保留3位小数位百分比,固定宽度10
000000.020 -浮点数-固定宽度10,保留3位小数
0000.01988 -浮点数-固定宽度10,保留5位小数
0001.10000 -浮点数-固定宽度10,保留5位小数
韩梅梅:“蕾哥,我想平时在家也能练习python,可是我家里的电脑没有安装python”
李蕾:“要不我周末去帮你装一下?”
...
且不提李蕾和韩梅梅下面做了什么,我们回顾一下完整代码:
#!/usr/bin/env python3
ROW_COUNT = 6
def without_fix(base_index):
# 宽度不固定
i = 0
while i < ROW_COUNT:
print(f'第{base_index+i}次 Hello world')
i += 1
def with_fix2(base_index):
# 固定宽度2
i = 0
while i < ROW_COUNT:
print(f'第{base_index+i:2}次 Hello world with_fix2({base_index})')
i += 1
def with_fix02(base_index):
# 固定宽度2,前面不足的话补0
i = 0
while i < ROW_COUNT:
print(f'第{base_index+i:02}次 Hello world with_fix02({base_index})')
i += 1
def with_auto_fix(base_index):
# 自动判断宽度
max_num = base_index+ROW_COUNT
max_width = len(f"{max_num}")
i = 0
while i < ROW_COUNT:
print(
f'第{base_index+i:0{max_width}}次 Hello world with_auto_fix({base_index})'
)
i += 1
def fix_fmts():
# 汇总
number = 123
print(f"{number:10}\t-整数,固定宽度10")
print(f"{number:010}\t-整数,固定宽度10,前面不足补0")
percent = .01987654321
print(f"{percent:10.3%}\t-浮点数-保留3位小数位百分比,固定宽度10")
print(f"{percent:010.3%}\t-浮点数-保留3位小数位百分比,固定宽度10,前面不足补0")
print(f"{percent:10.3f}\t-浮点数-固定宽度10,保留3位小数")
print(f"{percent:010.3f}\t-浮点数-固定宽度10,保留3位小数,前面不足补0")
print(f"{percent:10.5f}\t-浮点数-固定宽度10,保留5位小数")
print(f"{percent:010.5f}\t-浮点数-固定宽度10,保留5位小数,前面不足补0")
print(f"{1.1:10.5f}\t-浮点数-固定宽度10,保留5位小数")
width = 10
print(f"{1.1:0{width}.5f}\t-浮点数-通过变量指定宽度10,保留5位小数,前面不足补0")
if __name__ == "__main__":
print('====================')
print('-- without_fix(8) --')
without_fix(8)
print('-- without_fix(98) --')
without_fix(98)
print('-- with_fix2(8) --')
with_fix2(8)
print('-- with_fix2(98) --')
with_fix2(98)
print('-- with_fix02(8) --')
with_fix02(8)
print('-- with_fix02(98) --')
with_fix02(98)
print('-- with_auto_fix(8) --')
with_auto_fix(8)
print('-- with_auto_fix(98) --')
with_auto_fix(98)
print('-- fix_fmts() --')
fix_fmts()
print('===============')