ในการทำระบบออกใบกำกับภาษี (Tax Invoice), ใบเสร็จรับเงิน (Receipt), หรือเอกสารทางกฎหมายของไทย กรมสรรพากรและสถาบันการเงินต้องการตัวอักษรกำกับจำนวนเงินที่เป็นภาษาไทย (BahtText) เสมอ เพื่อป้องกันการแก้ไขตัวเลข

แม้จะดูเหมือนเป็นเรื่องง่าย แต่มี Edge Cases มากมายที่นักพัฒนามักพบข้อผิดพลาด


1. กฎการออกเสียง "เอ็ด" และ "ยี่"

  1. เลข 1 ในหลักหน่วย:
    • ถ้าเป็นเลขหลักหน่วยโดดๆ (เช่น 1) ให้อ่านว่า "หนึ่ง"
    • ถ้ามีเลขในหลักสิบขึ้นไป (เช่น 11, 21, 101, 1,001) เลข 1 ในหลักหน่วยต้องอ่านว่า "เอ็ด"
    • ข้อยกเว้น: หากเป็น 1,000,001 ให้อ่านว่า "หนึ่งล้านหนึ่ง" หรือ "หนึ่งล้านเอ็ด" (ตามความนิยมในเอกสารการเงินนิยมใช้ "เอ็ด")
  2. เลข 2 ในหลักสิบ:
    • ให้อ่านว่า "ยี่สิบ" เสมอ ไม่ใช่ "สองสิบ"
  3. เลข 1 ในหลักสิบ:
    • ให้อ่านว่า "สิบ" ไม่ใช่ "หนึ่งสิบ"

2. ปัญหาตัวเลขเกิน 1 ล้านบาท (Multiple Million Chunks)

ตัวเลขภาษาไทยจะวนลูปหน่วยนับทุกๆ 6 หลัก (สิบ, ร้อย, พัน, หมื่น, แสน, ล้าน)

ตัวอย่างเช่น:

  • 10,000,000 $\rightarrow$ สิบล้านบาทถ้วน
  • 1,000,000,000,000 $\rightarrow$ หนึ่งล้านล้านบาทถ้วน

การออกแบบฟังก์ชันที่ดีต้องแบ่งตัวเลขออกเป็นกลุ่มละ 6 หลัก (Chunks) จากขวาไปซ้าย แล้วนำมาประมวลผลวนซ้ำ


3. การปัดเศษและสตางค์

  • สตางค์จะต้องคิดจากทศนิยม 2 ตำแหน่งเท่านั้น
  • 0.005 ต้องจัดการปัดเศษ (Half-up หรือ Bankers Rounding) ให้ชัดเจนก่อนแปลง
  • หากไม่มีสตางค์ ต้องลงท้ายด้วยคำว่า "ถ้วน" เสมอ
// ตัวอย่างผลลัพธ์การแปลงจำนวนเงินเป็นตัวหนังสือ
console.log(formatBahtText(1001.25));
// Output: "หนึ่งพันเอ็ดบาทยี่สิบห้าสตางค์"

console.log(formatBahtText(5000000));
// Output: "ห้าล้านบาทถ้วน"