PL/SQL: Convert a Numeric Value into Thai Words

พอดีมีน้องขอตัวอย่างการเปลี่ยนตัวเลขเป็นตัวหนังสือภาษาไทยบน Oracle คุณน้องเธอจะขอมาประจำ ขอมาทีก็นึกที เพราะช่วงหลังไม่ค่อยได้โค้ดเท่าไร ซึ่งตัวโค้ดนั้นสามารถเขียนได้หลายวิธี แต่พอดีนึกออกแต่วิธีนี้ งันก็เลยขอโพสไว้ตรงนี้เลยก็แล้วกัน ยังไงก็ไปลอง copy ไปใช้ดู ได้เทสนิดหน่อย ผิดพลาดยังไงก็ขออภัยมา ณ ที่นี้น่ะครับ

Create or replace Function BahtText (pNUM in NUMBER) return VARCHAR2 is
   cRET   VARCHAR2(400);
Begin
   select decode(trunc(mod(pNUM,10000000000000)/1000000000000),
          1,'หนึ่งล้าน',2,'สองล้าน',3,'สามล้าน',4,'สี่ล้าน',5,'ห้าล้าน',
          6,'หกล้าน',7,'เจ็คล้าน',8,'แปดล้าน',9,'เก้าล้าน',NULL)||
          decode(trunc(mod(pNUM,1000000000000)/100000000000),
          1,'หนึ่งแสน',2,'สองแสน',3,'สามแสน',4,'สี่แสน',5,'ห้าแสน',
          6,'หกแสน',7,'เจ็คแสน',8,'แปดแสน',9,'เก้าแสน',NULL)||
          decode(trunc(mod(pNUM,100000000000)/10000000000),
          1,'หนึ่งหมื่น',2,'สองหมื่น',3,'สามหมื่น',4,'สี่หมื่น',5,'ห้าหมื่น',
          6,'หกหมื่น',7,'เจ็คหมื่น',8,'แปดหมื่น',9,'เก้าหมื่น',NULL)||
          decode(trunc(mod(pNUM,10000000000)/1000000000),
          1,'หนึ่งพัน',2,'สองพัน',3,'สามพัน',4,'สี่พัน',5,'ห้าพัน',
          6,'หกพัน',7,'เจ็คพัน',8,'แปดพัน',9,'เก้าพัน',NULL)||
          decode(trunc(mod(pNUM,1000000000)/100000000),
          1,'หนึ่งร้อย',2,'สองร้อย',3,'สามร้อย',4,'สี่ร้อย',5,'ห้าร้อย',
          6,'หกร้อย',7,'เจ็คร้อย',8,'แปดร้อย',9,'เก้าร้อย',NULL)||
          decode(trunc(mod(pNUM,100000000)/10000000),1,decode(trunc(mod(pNUM,10000000)/1000000),
          0,'สิบ',1,'สิบ',2,'สิบสอง',3,'สิบสาม',4,'สิบสี่',5,'สิบห้า',
          6,'สิบหก',7,'สิบเจ็ด',8,'สิบแปด',9,'สิบเก้า'),
          2,'ยี่สิบ',3,'สามสิบ',4,'สี่สิบ',5,'ห้าสิบ',6,'หกสิบ',7,'เจ็ดสิบ',8,'แปดสิบ',9,'เก้าสิบ',NULL)||
          decode(trunc(mod(pNUM,10000000)/1000000),1,decode(trunc(mod(pNUM,100000000)/10000000),
          0,'หนึ่ง',decode(trunc(mod(pNUM,10000000)/1000000),1,'เอ็ด',NULL)),
          decode(trunc(mod(pNUM,100000000)/10000000),1,NULL,
          decode(trunc(mod(pNUM,10000000)/1000000),2,'สอง',3,'สาม',4,'สี่',5,'ห้า',
          6,'หก',7,'เจ็ค',8,'แปด',9,'เก้า',NULL)))||
          decode(trunc(mod(pNUM,1000000)/1000000),
          0,decode(trunc(greatest(pNUM,999999)),999999,NULL,'ล้าน'),NULL)||
          decode(trunc(mod(pNUM,1000000)/100000),
          1,'หนึ่งแสน',2,'สองแสน',3,'สามแสน',4,'สี่แสน',5,'ห้าแสน',
          6,'หกแสน',7,'เจ็คแสน',8,'แปดแสน',9,'เก้าแสน',NULL)||
          decode(trunc(mod(pNUM,100000)/10000),
          1,'หนึ่งหมื่น',2,'สองหมื่น',3,'สามหมื่น',4,'สี่หมื่น',5,'ห้าหมื่น',
          6,'หกหมื่น',7,'เจ็คหมื่น',8,'แปดหมื่น',9,'เก้าหมื่น',NULL)||
          decode(trunc(mod(pNUM,10000)/1000),
          1,'หนึ่งพัน',2,'สองพัน',3,'สามพัน',4,'สี่พัน',5,'ห้าพัน',
          6,'หกพัน',7,'เจ็คพัน',8,'แปดพัน',9,'เก้าพัน',NULL)||
          decode(trunc(mod(pNUM,1000)/100),
          1,'หนึ่งร้อย',2,'สองร้อย',3,'สามร้อย',4,'สี่ร้อย',5,'ห้าร้อย',
          6,'หกร้อย',7,'เจ็คร้อย',8,'แปดร้อย',9,'เก้าร้อย',NULL)||
          decode(trunc(mod(pNUM,100)/10),1,decode(trunc(mod(pNUM,10)),
          0,'สิบ',1,'สิบเอ็ด',2,'สิบสอง',3,'สิบสาม',4,'สิบสี่',
          5,'สิบห้า',6,'สิบหก',7,'สิบเจ็ด',8,'สิบแปด',9,'สิบเก้า'),
          2,'ยี่สิบ',3,'สามสิบ',4,'สี่สิบ',5,'ห้าสิบ',
          6,'หกสิบ',7,'เจ็ดสิบ',8,'แปดสิบ',9,'เก้าสิบ',NULL)||
          decode(least(pNUM,1),1,decode(trunc(mod(pNUM,100)/10),1,NULL,decode(trunc(mod(pNUM,10)),
          1,decode(trunc(mod(pNUM,100)/10),0,'หนึ่ง','เอ็ด'),2,'สอง',3,'สาม',4,'สี่',5,'ห้า',
          6,'หก',7,'เจ็ด',8,'แปด',9,'เก้า',decode(pNUM,0,'ศูนย์',NULL)))||'บาท',decode(pNUM,0,'ศูนย์บาท',NULL))||
          decode(pNUM-trunc(pNUM),0,'ถ้วน',decode(trunc(mod(100*pNUM,100)/10),
          1,decode(trunc(mod(100*pNUM,10)),0,'สิบ',1,'สิบเอ็ด',2,'สิบสอง',3,'สิบสาม',4,'สิบสี่',
          5,'สิบห้า',6,'สิบหก',7,'สิบเจ็ด',8,'สิบแปด',9,'สิบเก้า')||
          decode(trunc(mod(100*pNUM,100)/10),0,'สตางค์',NULL),
          2,'ยี่สิบ',3,'สามสิบ',4,'สี่สิบ',5,'ห้าสิบ',6,'หกสิบ',7,'เจ็ดสิบ',8,'แปดสิบ',9,'เก้าสิบ',NULL))||
          decode(trunc(mod(100*pNUM,10)/10),0,decode(pNUM-trunc(pNUM),0,NULL,
          decode(trunc(mod(100*pNUM,100)/10),1,'สตางค์',
          decode(trunc(mod(100*pNUM,10)),0,'สตางค์',NULL))),NULL)||
          decode(trunc(mod(100*pNUM,100)/10),1,'',decode(trunc(mod(100*pNUM,10)),
          1,decode(trunc(mod(100*pNUM,100)/10),0,'หนึ่ง','เอ็ด'),2,'สอง',3,'สาม',4,'สี่',5,'ห้า',
          6,'หก',7,'เจ็ด',8,'แปด',9,'เก้า',NULL)||
          decode(trunc(mod(100*pNUM,10)),0,NULL,'สตางค์'))
   into   cRET
   from   DUAL;
   --
   return(cRET);
End;
/

ลองทดสอบกันดู

select BahtText(1231567890.12) from DUAL
/
BAHTTEXT(1231567890.12)
------------------------------------------------------------------------
หนึ่งพันสองร้อยสามสิบเอ็ดล้านห้าแสนหกหมื่นเจ็คพันแปดร้อยเก้าสิบบาทสิบสองสตางค์

select BahtText(8901231567890.11) from DUAL
/
BAHTTEXT(8901231567890.11)
------------------------------------------------------------------------
แปดล้านเก้าแสนหนึ่งพันสองร้อยสามสิบเอ็ดล้านห้าแสนหกหมื่นเจ็คพันแปดร้อยเก้าสิบบาทสิบเอ็ดสตางค์

select BahtText(3000000) from DUAL
/
BAHTTEXT(3000000)
------------------------------------------------------------------------
สามล้านบาทถ้วน

select BahtText(30) from DUAL
/
BAHTTEXT(30)
------------------------------------------------------------------------
สามสิบบาทถ้วน

select BahtText(1) from DUAL
/
BAHTTEXT(1)
------------------------------------------------------------------------
หนึ่งบาทถ้วน 

select BahtText(0) from DUAL
/
BAHTTEXT(0)
------------------------------------------------------------------------
ศูนย์บาทถ้วน  

select BahtText(0.1) from DUAL
/
BAHTTEXT(0.1)
------------------------------------------------------------------------
สิบสตางค์  

ถูกหรือเปล่าไม่แน่ใจ ก็ประมาณนี้ล่ะครับ ยังไงก็นำไปประยุกต์ใช้กันดู…

ขอบคุณ
น้องๆที่แจ้งมา
k.santichai
k.Surat Mahaboon

Last Updated : 16/10/2012 แก้ไขหลักหน่วยและหน่วยสตางค์
Last Updated : 05/06/2012 แก้ไขหน่วยล้านและหน่วยสตางค์

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s