String Formatter ใน Python

บทความนี้เราจะมาพูคถึง string formatters ใน Python กัน ซึ่ง formatter ในภาษา Python ก็มีการพัฒนาขึ้นเรื่อยๆ เราจะเปรียบเทียบ formatter ที่เป็นตัวเก่า (%) และตัวใหม่ (format) ที่พัฒนาขึ้น ตัวอย่างการใช้งานที่ใช้อยู่บ่อยๆ ก็แน่นอนว่าตัวใหม่ก็ต้องมีลูกเล่นและฟีเจอร์ใหม่ๆ ที่ดีกว่าตัวเดิมแน่นอน

Basic formatting

positional formatting เป็นการใช้งานที่เห็นได้บ่อยๆ ถ้าเราไม่ได้เปลี่ยนแปลงลำดับของ arguments ของเราบ่อยๆ รวมถึงจำนวนของ arguments ไม่เยอะ

แบบเก่า

"%s.%s" % ("imooh", "com")

แบบใหม่

"{}.{}".format("imooh", "com")

ผลลัพธ์

"imooh.com"

ข้อดี ของการใช้ format คือ เราสามารถระบุ index ที่เราต้องการได้ ถ้าเราต้องการใช้ argument มากกว่าหนึ่งครั้ง

แบบใหม่

"{0}.{1} {0}".format("imooh", "com")

ผลลัพธ์

"imooh.com imooh"

Padding และ Aligning String

เราสามารถระบุได้ว่าจะให้ formatter เพิ่ม (pad) ให้ได้ขนาดตามที่เราต้องการได้ แทนที่จะให้แสดงค่าของ argument โดยตรง ส่วน alignment นั้นจะแตกต่างกันคือแบบเก่า (%) ค่าเริ่มต้นจะชิดขวา (align right) ส่วนแบบใหม่ (format) ค่าเริ่มต้นจะชิดซ้าย (align left)

แบบเก่า (align-right)

"%10s" % ("imooh.com")

แบบใหม่ (align-right)

"{:>10}".format("imooh.com")

ผลลัพธ์

" imooh.com"

ข้อดี ของ format คือ เราสามารถเลือกได้ว่าจะเพิ่ม (pad) ด้วยตัวอักษรอะไรก็ได้ ไม่ต้องจำใจใช้แค่ช่องว่าง ^^

แบบใหม่

"{:*>10}".format("imooh.com")

ผลลัพธ์

"*imooh.com"

Truncating long string

เราสามารถเพิ่ม (pad) ได้ แน่นอนว่าเราก็สามารถตัด (truncate) ได้เหมือนกัน ตัวเลขที่อยู่หลัง . จะบอกจำนวนสูงสุดของอักขระที่เราต้องการให้แสดง เช่น ในตัวอย่างผมเป็นเลข 5 ก็จะเหลือผลลัพธ์คือ imooh

แบบเก่า

"%.5s" % ("imooh.com")

แบบใหม่

"{:.5}".format("imooh.com")

ผลลัพธ์

"imooh"

เราสามารถใช้ทั้ง padding และ truncating พร้อมกันได้

แบบเก่า

"%-10.5s" % ("imooh.com")

แบบใหม่

"{:10.5}".format("imooh.com")

ผลลัพธ์

"imooh     "

ตัวเลขและจำนวนเลขทศนิยม

ในเรื่องของตัวเลขก็จะมีการ padding และจำนวนทศนิยมที่เราสามารถกำหนดได้ เช่น ถ้าเราต้องการเลข 6 หลักและเพิ่มเลขศูนย์ด้านหน้าถ้าจำนวนตัวเลขไม่ถึง 6 หลัก พร้อมกับระบุเลขทศนิยม 2 ตำแหน่งด้วย

แบบเก่า

"%06.2f" % (123.1234)

แบบใหม่

"{:06.2f}".format(123.1234)

ผลลัพธ์

"0123.12"

**ข้อควรระวัง จำนวนตัวเลขนับรวมกับเลขทศนิยมด้วย

Named placeholders

เราสามารถตั้งชื่อตัวแปรเพื่ออ้างถึงใน format ได้ จะได้ง่ายในการใช้งาน

แบบเก่า

parameters = {"domain": "imooh.com", "title": "String Formatters"}
"%(domain)s - %(title)s" % (parameters)

แบบใหม่

parameters = {"domain": "imooh.com", "title": "String Formatters"}
"{domain} - {title}".format(**parameters)

ผลลัพธ์

"imooh.com - String Formatters"

Datetime Format

ที่เพิ่มเข้ามาใน formatter แบบใหม่ (format) ที่ไม่มีในแบบเก่า (%) ช่วยให้เราไม่ต้องเรียกใช้ฟังก์ชัน strftime ก่อน

"{} - {:%Y-%m-%d}".format("imooh.com", datetime(2020, 2, 29))

ผลลัพธ์

"imooh.com - 2020-02-29"

ขอบคุณแหล่งข้อมูลครับ