Function Baht Text บน Crystal Report

ผมว่าหลายท่านก็คง เคยใช้ Function BahtText ใน Excel มาแล้ว
แต่ปรากฎว่า บน Crystal Report ไม่มีให้ใช้ ก็ต้องเขียนมันขึ้นมาเอง ละ
บางท่านก็คง มี Function ไ้ว้ใช้อยู่แล้ว

แต่ผมก็ขอเสนอ Idea ในการเขียนไว้หน่อยแล้วกัน เผื่อว่าใคร จะนึกไม่ออก
บอกไม่ถูก เคยเขียนแล้วแต่ ไม่รู้ เอาไฟล์ไปไว้ไหน ก็มาเอา Code ผมไป
ประยุกต์ใช้ ก้อ ไม่ว่ากัน
(ได้เฉพาะเลขบวก หรือ มากกว่า หรือเท่ากับ ศูนย์ และ ตัวเลขไม่เกิน 12 หลัก )

Concept ก็ง่ายๆ ตามวิธีของผม คือ
1. วิธีการแปลง ตัวเลขเป็น String ก่อน ด้วย จำนวนทศนิยม 2 ตำแหน่ง ตัด Comma หรือ เครื่องหมาย
฿ หรือ $ ออก
2. แยกส่วน บาท และ สตางค์ ออกจากกัน ด้วยทศนิยม
3. นำส่วนสตางค์ มาแปลง เป็นคำ
4. นำส่วนบาท มาแปลง เป็นคำ
5. นำส่วนบาท และ สตางค์ ที่เป็น คำแล้ว มาเชื่อมกัน
6. แปลงคำพิเศษ เช่น ยี่สิบ หรือ คำว่า เอ็ด

หลักการมีแค่นี้ คราวนี้มาดู Code (เป็น Code ใน Crystal Report 2008)
Function ( NumberVar Amount);
(
Local StringVar TextOut:="";
Local StringVar Array N := ["","หนึ่ง","สอง","สาม","สี่","ห้า","หก","เจ็ด","แปด","เก้า"];
Local StringVar Array D := ["","สิบ","ร้อย","พัน","หมื่น","แสน","ล้าน"];
Local StringVar Array AmtBS; //แยกบาท แยก สตางค์
Local StringVar AmtBaht:="";
Local StringVar AmtStang:="";
AmtBaht := Totext(Amount,"0.00",2);
AmtBaht := Replace(AmtBaht,",","");
AmtBaht := Replace(AmtBaht,"$","");
AmtBaht := Replace(AmtBaht,"฿","");
AmtBS := Split(AmtBaht,".");
AmtBaht := AmtBS[1]; // บาท
AmtStang := AmtBS[2]; // สตางค์

// หาเศษสตางค์
TextOut:="";
Local NumberVar i;
IF (VAL(AmtStang)>0) THEN
(
FOR i:=1 To 2 DO
(
TextOut:=TextOut+ N[VAL(MID(AmtStang,i,1))+1] + IIF(VAL(MID(AmtStang,i,1))>0 ,D[2-i+1],"") ;

);

AmtStang:=TextOut+"สตางค์";
)
ELSE
(
AmtStang:="ถ้วน";
);

// กรณี ส่วนบาท

Local NumberVar nn;
TextOut:="";
nn :=LEN(AmtBaht);
IF (VAL(AmtBaht)>0) THEN
(
IF (nn<=6) THEN ( FOR i:=1 To nn DO ( TextOut:=TextOut+ N[VAL(MID(AmtBaht,i,1))+1] + IIF(VAL(MID(AmtBaht,i,1))>0 ,D[nn-i+1],"") ;

);

AmtBaht:=TextOut+"บาท";
)
ELSE
(
IF (nn>12) THEN
(
AmtBaht :="ไม่สามารถคำนวณ เกิน 12 หลักได้";
AmtStang:="";
)
ELSE
(
//แยกหกหลักแรก, หกหลักที่สอง
Local StringVar ML1:="";
Local StringVar ML2:="";
ML1:=RIGHT(AmtBaht,6); //ล้านปกติ
ML2:=LEFT(AmtBaht,LEN(AmtBaht)-LEN(ML1)); //เกินล้าน
TextOut:="";
nn :=LEN(ML2);
FOR i:=1 To nn DO
(
TextOut:=TextOut+ N[VAL(MID(ML2,i,1))+1] + IIF(VAL(MID(ML2,i,1))>0 ,D[nn-i+1],"") ;

);

ML2:=TextOut+"ล้าน";

TextOut:="";
nn :=LEN(ML1);
FOR i:=1 To nn DO
(
TextOut:=TextOut+ N[VAL(MID(ML1,i,1))+1] + IIF(VAL(MID(ML1,i,1))>0 ,D[nn-i+1],"") ;

);

AmtBaht:=ML2+TextOut+"บาท";
);
);
)
ELSE
(
AmtBaht:="";
);

TextOut:=AmtBaht+ " " +AmtStang;
TextOut:=Replace(TextOut,"หนึ่งสิบ","สิบ");
TextOut:=Replace(TextOut,"สองสิบ","ยี่สิบ");
TextOut:=Replace(TextOut,"สิบหนึ่ง","สิบเอ็ด");
TextOut;
)


ก็ไม่ยากไร แต่บางทีมานั่งเขียนใหม่ ก็เสียเวลาครับ

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ปัญหาเด็ก กลืน ดินน้ำมัน

ปัญหา Custom Paper Size บน Crystal Report