【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}}}\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)遺留一個問題,怎么讓===...自適應表寬

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM