一、用字符填充
>>> '{0:*>10}'.format(10) #冒号前的0为索引位置 '********10' >>> '{0:a>10}'.format(10) 'aaaaaaaa10'
>>> "{:010}".format(123) '0000000123'
二、指定对齐方式
1、左对齐 <
>>> "{:0<10}".format(123) '1230000000'
2、右对齐 >
>>> "{:0>10}".format(123) '0000000123'
3、居中 ^
>>> "{:0^10}".format(123) '0001230000'
三、实例:指定宽度打印价格列表
width = int(input('Input data:')) price_width = 10 item_width = width - price_width header_fm = '{{:{}}}{{:>{}}}'.format(item_width,price_width) fmt = '{{:{}}}{{:>{}.2f}}'.format(item_width,price_width) print('='*width) print(header_fm.format('Item','Price')) print('-'*width) print(fmt.format('Apples',0.4)) print(fmt.format('Pears',0.5)) print(fmt.format('Cantaloupes',1.92)) print('='*width)
=================================== Item Price ----------------------------------- Apples 0.40 Pears 0.50 Cantaloupes 1.92 ===================================
1、花括号可以转义花括号
上述是教程里的案例以及输出内容,但是不太理解以下问题:
假定 item_width = 20,price_width = 15,那么 '{{:{}}}{{:>{}}}'.format(item_width,price_width) 就等于'{{:{}}}{{:>{}}}'.format(20,15),我用python自带的idle获取表达式'{{:{}}}{{:>{}}}'.format(20,15)的输出结果为
>>> '{{:{}}}{{:>{}}}'.format(20,15) '{:20}{:>15}'
从之前的学习认知,我们可以知道,一对{}代表一个占位符,对应一个字符串。那么'{{:{}}}'.format(20) 应该是输出 '{{:20}}',怎么会是{:20}呢,百思不得其解,百度了一波没啥作用。后面在论坛上看到有人说花括号可以转义花括号,这个问题就迎刃而解了
2、中文排版对齐问题
搬移代码的时候,自动把入参换成中文了。发现同样的代码,英文输出结果是对齐的,符合预期;而中文存在字符格式化不整齐的现象,存在一定偏移。
=================================== Item Price ----------------------------------- Apples 0.40 Pears 0.50 Cantaloupes 1.92 ===================================
=================================== Item Price ----------------------------------- 苹果 0.40 梨 0.50 哈密瓜 1.92 ===================================
原因是在打印多组中文的时候,不是每组中文的字符串宽度都一样,当中文字符宽度不够的时候,程序采用英文空格填充,中英文空格宽度不一样,就会导致输出文本不整齐。所以解决方法就是在宽度不够时采用中文空格填充,中文空格的编码为chr(12288)。最后的代码以及实现效果如下:
price_width = 10 item_width = width - price_width header_fm = '{{:{2}<{0}}}\t{{:{2}<{1}}}'.format(item_width,price_width,chr(12288)) #\t 当前八个字符的单元结束,进入到下一个八个字符的单元中 fmt = '{{:{2}<{0}}}\t{{:{2}<{1}.2f}}'.format(item_width,price_width,chr(12288)) print('='*50) print(header_fm.format('名称','价格')) print('-'*50) print(fmt.format('苹果',0.4)) print(fmt.format('梨',0.5)) print(fmt.format('哈密瓜',1.92)) print('='*50)
================================================== 名称 价格 -------------------------------------------------- 苹果 0.40 梨 0.50 哈密瓜 1.92 ==================================================
(1){{:{2}<{0}}},字符串默认向左对齐,为什么还要加对齐符<
---如果不加,第一次格式化后,表达式='{:\u300010}{:>15},中文空格\u3000和宽度10难以区分
(2){{:{2}<{1}}},价格从右对齐改成了左对齐
---应该是因为中文和价格数字的占位不同,所有向右对齐能解决空格补充问题,但是不能解决字符串本身的长度差异,所以向左对齐相对看起来比较整齐点
(3)遗留一个问题,怎么让===...自适应表宽