Humanise the Number in Python with "Humanize"

เมื่อหลายวันก่อน เรานั่งเขียนงานอยู่ชิ้นนึง แล้วเราต้องการ จัดการตัวเลข และ พวกเวลาหลาย ๆ อย่าง เพื่อให้เราอ่านแล้วเข้าใจ และ อ่านได้ง่าย เช่นพวกตัวเลข เราอยากจะได้ตัวเลขที่ใส่ Comma มา เช่น 1,000 เราอยากได้แบบนี้ แต่ถ้าเรา Print จาก Python มาตรง ๆ มันจะได้ 1000 แทน ทำเองก็เสียเวลาจนไปเจอ Library ตัวนึงที่ชื่อว่า Humanize วันนี้เลยจะเอามาเขียนให้อ่านกันว่า มันทำอะไรได้บ้าง

Number

สำหรับการ Format ตัวเลข มันทำได้เยอะมาก ๆ แต่เราจะหยิบอันที่เราใช้งาน และ เราคิดว่า เออ มันทำให้เราทำงานได้ง่ายขึ้นมาเล่นให้ดูกันดีกว่า

> import humanize
> humanize.intcomma(1_000)

'1,000'

เริ่มอยาก Feature ที่เราอยากได้มาใช้งานเลยคือ การใส่ Comma ให้กับตัวเลข มันใช้ Function ที่ชื่อว่า intcomma() เราแค่ใส่ตัวเลขเข้าไป แล้วมันจะแปลงออกมาเป็น String ที่ใส่ Comma ให้กับชุดตัวเลขเราเรียบร้อยแล้ว จากเดิมที่เราต้องเขียน Script ยากมาก ๆ ก็มีคนทำมาให้เราเสร็จเลย

> humanize.intword (2_000)

'2.0 thousand'

นอกจากนั้น เวลาเราแสดงผลตัวเลขเยอะ ๆ เช่นหลักล้าน หรือมากกว่านั้น ถึงเราจะใส่ Comma แล้วก็เถอะ มันก็ยังอ่านยากอยู่ดี ทำให้ Function intword() เข้ามาช่วยเราเยอะมาก ๆ เพราะมันจะแปลงให้มันมีข้อความที่ทำให้อ่านได้ง่ายขึ้น ตัวอย่างด้านบน เราใส่ไป 2000 มันก็แปลงออกมาเป็น 2.0 พัน อ่านง่ายกว่าเดิมเยอะมาก ๆ แต่เอ๊ะ อ่านแปลก ๆ นะ 2.0 พัน

> humanize.intword (2_000, '%d')

'2 thousand'

เราสามารถใช้ Number Format เป็นอีก Argument ใส่เข้าไปได้ เช่น เราใส่ %d ก็คือ Integer ใช่มั้ยฮะ มันก็เลยออกมาเป็น 2 พัน เฉย ๆ หรือจริง ๆ ถ้าเราทำให้ดีนะ เราสามารถเช็คได้เลยนะว่า มันมีจุดตามท้ายมั้ย แล้วถ้าไม่มี เราก็ใช้เป็น 2 พัน แต่ถ้ามันมีเช่น 2100 เราก็ให้มันออกมาเป็น 2.1 พันอะไรแบบนั้นก็ได้นะ เช็คเอาไม่ยากเท่าไหร่

> humanize.scientific(312400000000000000, 3)

'3.124 x 10¹⁷'

ด้วยความที่เราเขียนโปรแกรมสำหรับทำงานทางวิทยาศาสตร์ ทำงานกับตัวเลขขนาดใหญ่มาก ๆ ทำให้ การแสดงผลเป็น Scientific Notation ทำให้เราทำงานได้ง่ายขึ้นเยอะ แต่ถ้าให้เรามานั่งเขียนเองมันก็ได้แหละ แค่มันเสียเวลาเท่านั้นแหละ ใน Humanize เขาทำมาให้เราเรียกใช้งานผ่าน Function scientific() ได้ตรง ๆ เลย

> humanize.metric(2120, 'B')
'2.12 kB'

และสุดท้าย อันนี้คือแบบ เออ เขียนเองมันก็ไม่ยากนะ แต่เหนื่อยเช็ค อันนี้มาจากเรื่องจริงเลยคือ เราเขียนโปรแกรมที่ทำงานเกี่ยวกับพวก Bioinformatics เรายุ่งกับขนาดของ DNA อะไรพวกนั้น เช่น 2,000 Bases (เราจะย่อเป็น B) ตัวเลขที่เข้ามา มันมีตั้งแต่หลักพัน ยัน พันล้าน เลย ถ้าเรามานั่งเช็คทุก Prefix มันก็ทำได้แหละ แต่ ทำไมเราต้องมานั่งเขียนเองวะ ไม่เอาเวลาไป Focus กับ Logic ของมันมากกว่าอะไรแบบนั้น จนไปเจอ Function metric แหละ โอ้ววววว ใช้ค่ะ

สิ่งที่ metric() ทำคือ มันจะแปลงหน่วยให้เราตาม Prefix บนระบบ Matric ที่เรารู้จักกันเช่นพวก Kilo (k) และ Mega (M) อะไรพวกนั้น สิ่งที่เราจะต้องใส่เข้าไปคือ จำนวนตัวเลขของเรา พร้อมกับหน่วย เช่นในตัวอย่างด้านบน เราใส่เป็น B หรือ Bases พอเรายัดตัวเลข 2120 มันเลยออกมาเป็น 2.12 kB ไปเลย แน่นอนว่า เราเอามาใช้กับอะไรก็ได้ที่เราต้องการจะอ้างอิงด้วย Prefix ในระบบ Metric ได้หมดเลย ทั้งพวกขนาดไฟล์ และ อื่น ๆ ได้หมดเลย

อย่างที่บอกว่าในหมวดของตัวเลข มันทำได้เยอะกว่านี้อีก แต่อันนี้เป็น 4 Functions ที่เราใช้งานบ่อย ๆ ในงานที่เราทำเลย เป็นตัวที่ เออ มันก็เขียนเองได้แหละ แต่ขี้เกียจ เสียเวลาอะ ใช้ Library แหละ ง่ายดี

File Size

อีกอันที่เราไปเปิด Documentation มาแล้วก็เอ๊ะ มันเอามาทำไมวะ แต่เอาเถอะสะดวกดีคือ File Size หรือการจัดการพวกขนาดไฟล์ คิดถึงเวลาเราทำงานปกติ เราก็จะได้ขนาดไฟล์มาเป็น Byte ใช่มะ ใช้ os.path.getsize() ใน Python แล้วเราอาจจะต้องการแปลงให้มันอยู่ในรูปแบบที่อ่านง่าย เราก็อาจจะใช้ humanize.metric() ได้เลย แต่อันนี้คือ ไม่ ๆ เขามี Function เฉพาะกับขนาดไฟล์ให้เราเลย

> humanize.naturalsize(2000)
'2.0 kB'

Function ที่เอามาให้เราทำงานกับขนาดของไฟล์คือ humanize.naturalsize() สิ่งที่เจ๋งขึ้น ที่เราเห็นได้ชัดคือ เราไม่ต้องใส่หน่วย เพราะมันจะ Assume เลยว่า เลขที่เราใส่เข้ามา เราให้หน่วยเป็น Byte มาให้เราเลย ดังนั้น เมื่อเราใส่ 2,000 เข้าไป มันจะคิดว่าเป็น 2,000 Bytes เลยกลายเป็น 2.0 kB ให้เราทันที

> humanize.naturalsize(2000, True)
'2.0 KiB'

หรือ ถ้าเราต้องการแสดงผลเป็น Binary Prefix มันก็มีมาให้เราเหมือนกัน เออ นี่แหละ ทำไมถึงใช้ metrics() เฉย ๆ มันไม่ได้ เพราะแบบนี้เลย หรือเรายังสามารถแปลงเป็นพวก GNU style ได้เลย มันทำได้หมด ติดใจจริงอะไรจริง

สรุป

Humanize เป็น Library บน Python ที่ทำให้เราสามารถแปลงตัวเลขออกมาให้อยู่ในรูปที่คนเราอ่านแล้วเข้าใจได้ง่าย โดยที่เขาเตรียมทุกอย่างมาให้เราหมดแล้ว เราแค่เรียก Function เขาขึ้นมา ทำให้เรามีเวลาไปทำอย่างอื่นขึ้นเยอะ แต่จริง ๆ มันทำงานกับพวกเรื่องของเวลาได้ด้วยนะ แต่เราแนะนำว่า ถ้าจะเล่นพวกเวลา ลองไปดู Pendulum เราเคยเขียนไว้ละ มันมี Function สำหรับ ทำให้เวลามันอยู่ในรูปที่คนอ่านได้ง่ายอยู่เหมือนที่ Humanize ทำได้เลย แต่มันมี DataType กับพวก Support Function เตรียมมาให้เราทำงานได้ง่ายกว่าเยอะ ก็ลองไปเล่นกันได้