【Python】【字符串】符号、对齐和用字符填充

一、用字符填充

>>> '{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.400.50
哈密瓜                            1.92
===================================

       原因是在打印多组中文的时候,不是每组中文的字符串宽度都一样,当中文字符宽度不够的时候,程序采用英文空格填充,中英文空格宽度不一样,就会导致输出文本不整齐。所以解决方法就是在宽度不够时采用中文空格填充,中文空格的编码为chr(12288)。最后的代码以及实现效果如下:

price_width = 10
item_width = width - price_width

header_fm = '{{:{2}<{0}}}	{{:{2}<{1}}}'.format(item_width,price_width,chr(12288)) #	 当前八个字符的单元结束,进入到下一个八个字符的单元中
fmt = '{{:{2}<{0}}}	{{:{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)遗留一个问题,怎么让===...自适应表宽

原文地址:https://www.cnblogs.com/12345zjl/p/15009984.html