ในการทำระบบออกใบกำกับภาษี (Tax Invoice), ใบเสร็จรับเงิน (Receipt), หรือเอกสารทางกฎหมายของไทย กรมสรรพากรและสถาบันการเงินต้องการตัวอักษรกำกับจำนวนเงินที่เป็นภาษาไทย (BahtText) เสมอ เพื่อป้องกันการแก้ไขตัวเลข
แม้จะดูเหมือนเป็นเรื่องง่าย แต่มี Edge Cases มากมายที่นักพัฒนามักพบข้อผิดพลาด
1. กฎการออกเสียง "เอ็ด" และ "ยี่"
- เลข
1ในหลักหน่วย:- ถ้าเป็นเลขหลักหน่วยโดดๆ (เช่น
1) ให้อ่านว่า "หนึ่ง" - ถ้ามีเลขในหลักสิบขึ้นไป (เช่น
11,21,101,1,001) เลข 1 ในหลักหน่วยต้องอ่านว่า "เอ็ด" - ข้อยกเว้น: หากเป็น
1,000,001ให้อ่านว่า "หนึ่งล้านหนึ่ง" หรือ "หนึ่งล้านเอ็ด" (ตามความนิยมในเอกสารการเงินนิยมใช้ "เอ็ด")
- ถ้าเป็นเลขหลักหน่วยโดดๆ (เช่น
- เลข
2ในหลักสิบ:- ให้อ่านว่า "ยี่สิบ" เสมอ ไม่ใช่ "สองสิบ"
- เลข
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: "ห้าล้านบาทถ้วน"