บทความนี้เราจะมาพูคถึง 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"
ขอบคุณแหล่งข้อมูลครับ