CREATE OR REPLACE PACKAGE PKG_TERBILANG IS
/*******************************************************************************
Nama Package : PKG_TERBILANG
Deskripsi : Menghasilkan ucapan bilangan dalam bahasa Indonesia dan
Inggris
*******************************************************************************/
TYPE typeSpellString IS VARRAY(100) OF VARCHAR2(20);
arrSpellString typeSpellString;
/* Bahasa Indonesia */
FUNCTION INA(vchrDigitString VARCHAR2) RETURN VARCHAR2;
/* English */
FUNCTION ENG(vchrDigitString VARCHAR2) RETURN VARCHAR2;
/* Bahasa Indonesia */
FUNCTION INARupiah(vchrDigitString VARCHAR2) RETURN VARCHAR2;
/* English */
FUNCTION ENGRupiah(vchrDigitString VARCHAR2) RETURN VARCHAR2;
END;
CREATE OR REPLACE PACKAGE BODY PKG_TERBILANG IS
/* Initialization */
/* Must be called before executing other procedures */
PROCEDURE Initialize IS
BEGIN
arrSpellString := typeSpellString (’SATU ‘, –1
‘DUA ‘,
‘TIGA ‘,
‘EMPAT ‘,
‘LIMA ‘,
‘ENAM ‘,
‘TUJUH ‘,
‘DELAPAN ‘,
‘SEMBILAN ‘,
‘PULUH ‘, –10
‘BELAS ‘,
‘SE’,
‘RATUS ‘,
NULL,
‘RIBU ‘,
‘JUTA ‘,
‘MILYAR ‘,
‘TRILIUN ‘,
NULL,
NULL, –20
‘ONE ‘,
‘TWO ‘,
‘THREE ‘,
‘FOUR ‘,
‘FIVE ‘,
‘SIX ‘,
‘SEVEN ‘,
‘EIGHT ‘,
‘NINE ‘,
‘TEN ‘, –30
‘ELEVEN ‘,
‘TWELVE ‘,
‘THIRTEEN ‘,
‘FOURTEEN ‘,
‘FIFTEEN ‘,
‘SIXTEEN ‘,
‘SEVENTEEN ‘,
‘EIGHTEEN ‘,
‘NINETEEN ‘,
‘TWENTY’, –40
‘THIRTY’,
‘FOURTY’,
‘FIFTY’,
‘SIXTY’,
‘SEVENTY’,
‘EIGHTY’,
‘NINETY’,
‘AND ‘,
‘HUNDRED ‘,
NULL, –50
‘THOUSAND ‘,
‘MILLION ‘,
‘BILLION ‘,
‘TRILLION ‘);
END;
/* Bahasa Indonesia two digit spelling */
FUNCTION INASpell2(vchrDigit2 VARCHAR2) RETURN VARCHAR2 IS
intLen NUMBER;
chrDigit1 CHAR(1);
chrDigit2 CHAR(1);
BEGIN
intLen := LENGTH(vchrDigit2);
chrDigit1 := SUBSTR(vchrDigit2, 1, 1);
chrDigit2 := SUBSTR(vchrDigit2, 2, 1);
IF intLen = 2 THEN
IF (chrDigit1 = ‘0′) THEN
BEGIN
IF (chrDigit2 = ‘0′) THEN
RETURN arrSpellString(14);
ELSE
RETURN arrSpellString(TO_NUMBER(chrDigit2));
END IF;
END;
ELSIF (chrDigit1 = ‘1′) THEN
BEGIN
IF (chrDigit2 = ‘0′) THEN
RETURN arrSpellString(12)||arrSpellString(10);
ELSIF (chrDigit2 = ‘1′) THEN
RETURN arrSpellString(12)||arrSpellString(11);
ELSE
RETURN arrSpellString(TO_NUMBER(chrDigit2))||arrSpellString(11);
END IF;
END;
ELSE
BEGIN
IF (chrDigit2 = ‘0′) THEN
RETURN arrSpellString(TO_NUMBER(chrDigit1))||arrSpellString(10);
ELSE
RETURN arrSpellString(TO_NUMBER(chrDigit1))||arrSpellString(10)||arrSpellString(TO_NUMBER(chrDigit2));
END IF;
END;
END IF;
ELSE
RETURN arrSpellString(TO_NUMBER(chrDigit1));
END IF;
END;
/* Bahasa Indonesia three digit spelling */
FUNCTION INASpell3(vchrDigit3 VARCHAR2) RETURN VARCHAR2 IS
intLen NUMBER(1);
chrDigit1 CHAR(1);
chrDigit2 CHAR(1);
chrDigit3 CHAR(1);
BEGIN
intLen := LENGTH(vchrDigit3);
chrDigit1 := SUBSTR(vchrDigit3, 1, 1);
chrDigit2 := SUBSTR(vchrDigit3, 2, 1);
chrDigit3 := SUBSTR(vchrDigit3, 3, 1);
IF (intLen = 1) THEN
BEGIN
IF (chrDigit1 = ‘0′) THEN
RETURN arrSpellString(14);
ELSE
RETURN arrSpellString(TO_NUMBER(chrDigit1));
END IF;
END;
ELSIF (intLen = 2) THEN
BEGIN
RETURN INASpell2(vchrDigit3);
END;
ELSE
BEGIN
IF (chrDigit1 = ‘0′) THEN
RETURN INASpell2(SUBSTR(vchrDigit3, -2, 2));
ELSIF (chrDigit1 = ‘1′) THEN
RETURN arrSpellString(12)||arrSpellString(13)||INASpell2(SUBSTR(vchrDigit3, -2, 2));
ELSE
RETURN arrSpellString(TO_NUMBER(chrDigit1))||arrSpellString(13)||INASpell2(SUBSTR(vchrDigit3, -2, 2));
END IF;
END;
END IF;
END;
/* Bahasa Indonesia integer spelling */
FUNCTION INASpellInteger(vchrDigitInteger VARCHAR2) RETURN VARCHAR2 IS
intLen NUMBER;
int3DigitCount NUMBER;
intStart NUMBER;
intLenSub NUMBER;
i NUMBER;
vchrSpell VARCHAR2(512) := ”;
vchrSpellTemp VARCHAR2(512) := NULL;
BEGIN
intLen := LENGTH(vchrDigitInteger);
int3DigitCount := CEIL(intLen / 3);
intStart := 1;
FOR i IN 1..int3DigitCount LOOP
intStart := i * 3;
intLenSub := 3;
IF (intStart > intLen) THEN
intLenSub := intLen – (intStart – 3);
intStart := intLen;
END IF;
vchrSpellTemp := INASpell3(SUBSTR(vchrDigitInteger, -intStart, intLenSub));
IF vchrSpellTemp IS NULL THEN
vchrSpell := vchrSpell;
ELSE
vchrSpell := vchrSpellTemp||arrSpellString(13+i)||vchrSpell;
END IF;
END LOOP;
RETURN vchrSpell;
END;
/* Bahasa Indonesia spelling */
FUNCTION INA(vchrDigitString VARCHAR2) RETURN VARCHAR2 IS
BEGIN
Initialize;
RETURN INASpellInteger(vchrDigitString);
END;
/* English two digit spelling */
FUNCTION ENGSpell2(vchrDigit2 VARCHAR2) RETURN VARCHAR2 IS
intLen NUMBER;
chrDigit1 CHAR(1);
chrDigit2 CHAR(1);
BEGIN
intLen := LENGTH(vchrDigit2);
chrDigit1 := SUBSTR(vchrDigit2, 1, 1);
chrDigit2 := SUBSTR(vchrDigit2, 2, 1);
IF intLen = 2 THEN
IF (chrDigit1 = ‘0′) THEN
BEGIN
IF (chrDigit2 = ‘0′) THEN
RETURN arrSpellString(14);
ELSE
RETURN arrSpellString(20+TO_NUMBER(chrDigit2));
END IF;
END;
ELSIF (chrDigit1 = ‘1′) THEN
BEGIN
RETURN arrSpellString(30+TO_NUMBER(chrDigit2));
END;
ELSE
BEGIN
IF (chrDigit2 = ‘0′) THEN
RETURN arrSpellString(38+TO_NUMBER(chrDigit1))||’ ‘;
ELSE
RETURN arrSpellString(38+TO_NUMBER(chrDigit1))||’-'||arrSpellString(20+TO_NUMBER(chrDigit2));
END IF;
END;
END IF;
ELSE
RETURN arrSpellString(20+TO_NUMBER(chrDigit1));
END IF;
END;
/* English three digit spelling */
FUNCTION ENGSpell3(vchrDigit3 VARCHAR2) RETURN VARCHAR2 IS
intLen NUMBER(1);
chrDigit1 CHAR(1);
chrDigit2 CHAR(1);
chrDigit3 CHAR(1);
vchrSpellTemp VARCHAR2(500);
BEGIN
intLen := LENGTH(vchrDigit3);
chrDigit1 := SUBSTR(vchrDigit3, 1, 1);
chrDigit2 := SUBSTR(vchrDigit3, 2, 1);
chrDigit3 := SUBSTR(vchrDigit3, 3, 1);
IF (intLen = 1) THEN
BEGIN
IF (chrDigit1 = ‘0′) THEN
RETURN arrSpellString(14);
ELSE
RETURN arrSpellString(20+TO_NUMBER(chrDigit1));
END IF;
END;
ELSIF (intLen = 2) THEN
BEGIN
RETURN ENGSpell2(vchrDigit3);
END;
ELSE
BEGIN
IF (chrDigit1 = ‘0′) THEN
RETURN ENGSpell2(SUBSTR(vchrDigit3, -2, 2));
ELSE
vchrSpellTemp := ENGSpell2(SUBSTR(vchrDigit3, -2, 2));
IF vchrSpellTemp IS NULL THEN
RETURN arrSpellString(20+TO_NUMBER(chrDigit1))||arrSpellString(49)||vchrSpellTemp;
ELSE
RETURN arrSpellString(20+TO_NUMBER(chrDigit1))||arrSpellString(49)||arrSpellString(48)||vchrSpellTemp;
END IF;
END IF;
END;
END IF;
END;
/* English integer spelling */
FUNCTION ENGSpellInteger(vchrDigitInteger VARCHAR2) RETURN VARCHAR2 IS
intLen NUMBER;
int3DigitCount NUMBER;
intStart NUMBER;
intLenSub NUMBER;
i NUMBER;
vchrSpell VARCHAR2(512) := ”;
vchrSpellTemp VARCHAR2(512) := NULL;
BEGIN
intLen := LENGTH(vchrDigitInteger);
int3DigitCount := CEIL(intLen / 3);
intStart := 1;
FOR i IN 1..int3DigitCount LOOP
intStart := i * 3;
intLenSub := 3;
IF (intStart > intLen) THEN
intLenSub := intLen – (intStart – 3);
intStart := intLen;
END IF;
vchrSpellTemp := ENGSpell3(SUBSTR(vchrDigitInteger, -intStart, intLenSub));
IF vchrSpellTemp IS NULL THEN
vchrSpell := vchrSpell;
ELSE
vchrSpell := vchrSpellTemp||arrSpellString(49+i)||vchrSpell;
END IF;
END LOOP;
RETURN vchrSpell;
END;
/* English spelling */
FUNCTION ENG(vchrDigitString VARCHAR2) RETURN VARCHAR2 IS
BEGIN
Initialize;
RETURN ENGSpellInteger(vchrDigitString);
END;
/* Bahasa Indonesia spelling with Rupiah currency */
FUNCTION INARupiah(vchrDigitString VARCHAR2) RETURN VARCHAR2 IS
vchrInString VARCHAR2(30);
BEGIN
vchrInString := TO_CHAR(TRUNC(TO_NUMBER(vchrDigitString), 2));
RETURN INA(TO_CHAR(TRUNC(TO_NUMBER(vchrInString))))||’ RUPIAH ‘||
INA(TO_CHAR((TO_NUMBER(vchrInString) – TRUNC(TO_NUMBER(vchrInString))) * 100));
END;
/* English spelling with Rupiah currency */
FUNCTION ENGRupiah(vchrDigitString VARCHAR2) RETURN VARCHAR2 IS
vchrInString VARCHAR2(30);
BEGIN
vchrInString := TO_CHAR(TRUNC(TO_NUMBER(vchrDigitString), 2));
RETURN ENG(TO_CHAR(TRUNC(TO_NUMBER(vchrInString))))||’ RUPIAHS ‘||
ENG(TO_CHAR((TO_NUMBER(vchrInString) – TRUNC(TO_NUMBER(vchrInString))) * 100));
END;
END ;
sumber: http://ibrahim.burhan.biz/2007/02/13/oracle-package-untuk-fungsi-terbilang-repost/
Mei 29, 2007 at 2:49 am
gmana kalo bilangan yg ber koma?
soalnya blum mencakup..
Mei 29, 2007 at 5:05 am
yahh anda mgkin bisa kembangin saja yahh
tapi coba versi terbilang pake bahasa indonesia dan ini udah bisa seperti anda mau.
##Fun :terbilang.fnc
##Desc :Untuk mengkonversi nilai number menjadi terbilang
##Date :May-2007
##Sumber :sumber code ini didapat dari
http://ibrahim.burhan.biz/2007/02/13/oracle-package-untuk-fungsi-terbilang-repost/
Posted in :.Oracle PL/SQL | Edit| 4 Comments ยป
CREATE OR REPLACE FUNCTION terbilang(nilai VARCHAR2)
RETURN VARCHAR2 IS
km NUMBER;
tt NUMBER;
satu VARCHAR2(20);
dua VARCHAR2(5);
dum VARCHAR2(1);
dum2 VARCHAR2(1);
atr VARCHAR2(20);
back NUMBER;
idn NUMBER;
total VARCHAR2(600);
total1 VARCHAR2(500);
total2 VARCHAR2(100);
BEGIN
km := 0;
tt := 0;
dum2 := ”;
atr := ”;
total := ”;
total1 := ”;
total2 := ”;
back := 0;
idn := 0;
FOR i IN 1..LENGTH(nilai)
LOOP
dum := SUBSTR(nilai,i,1);
IF dum != ‘,’ AND dum != ‘.’ AND tt = 0 THEN
satu := satu || dum;
END IF;
IF dum != ‘,’ AND dum != ‘.’ AND tt = 1 THEN
dua := dua || dum;
END IF;
IF dum = ‘,’ THEN
km := km + 1;
END IF;
IF dum = ‘.’ THEN
tt := 1;
END IF;
END LOOP;
back := LENGTH(satu);
FOR i IN 1..LENGTH(satu)
LOOP
idn := idn + 1;
dum := SUBSTR(satu,idn,1);
IF dum = ‘1′ THEN
atr := ’se’;
IF LENGTH(satu) > 4 AND back = 4 THEN
atr := ‘Satu ‘;
END IF;
IF back = 1 OR back = 7 OR back = 10 OR back
= 13 THEN
atr := ‘Satu ‘;
END IF;
IF back = 2 OR back = 5 OR back = 8 OR back
= 11 THEN
dum2 :=SUBSTR(satu,(idn+1),1);
IF dum2 = ‘0′ THEN
atr := ‘Sepuluh ‘;
END IF;
IF dum2 = ‘1′ THEN
atr := ‘Sebelas ‘;
END IF;
IF dum2 = ‘2′ THEN
atr := ‘Dua belas ‘;
END IF;
IF dum2 = ‘3′ THEN
atr := ‘Tiga belas ‘;
END IF;
IF dum2 = ‘4′ THEN
atr := ‘Empat belas ‘;
END IF;
IF dum2 = ‘5′ THEN
atr := ‘Lima belas ‘;
END IF;
IF dum2 = ‘6′ THEN
atr := ‘Enam belas ‘;
END IF;
IF dum2 = ‘7′ THEN
atr := ‘Tujuh belas ‘;
END IF;
IF dum2 = ‘8′ THEN
atr := ‘Delapan belas ‘;
END IF;
IF dum2 = ‘9′ THEN
atr := ‘Sembilan belas ‘;
END IF;
back := back – 1;
idn := idn + 1;
END IF;
END IF;
IF dum = ‘2′ THEN
atr := ‘Dua ‘;
END IF;
IF dum = ‘3′ THEN
atr := ‘Tiga ‘;
END IF;
IF dum = ‘4′ THEN
atr := ‘Empat ‘;
END IF;
IF dum = ‘5′THEN
atr := ‘Lima ‘;
END IF;
IF dum = ‘6′ THEN
atr := ‘Enam ‘;
END IF;
IF dum = ‘7′ THEN
atr := ‘Tujuh ‘;
END IF;
IF dum = ‘8′ THEN
atr := ‘Delapan ‘;
END IF;
IF dum = ‘9′ THEN
atr := ‘Sembilan ‘;
END IF;
IF dum = ‘0′ THEN
atr := ”;
END IF;
back := back – 1;
IF back = 12 AND
(dum != ‘0′ OR
SUBSTR(satu,(idn-1),1) != ‘0′
OR SUBSTR(satu,(idn-2),1) != ‘0′) THEN
atr := atr || ‘trilyun ‘;
END IF;
IF back = 9 AND
(dum != ‘0′ OR
SUBSTR(satu,(idn-1),1) != ‘0′
OR SUBSTR(satu,(idn-2),1) != ‘0′) THEN
atr := atr || ‘milyar ‘;
END IF;
IF back = 6 AND
(dum != ‘0′ OR
SUBSTR(satu,(idn-1),1) != ‘0′
OR SUBSTR(satu,(idn-2),1) != ‘0′) THEN
atr:= atr || ‘juta ‘;
END IF;
IF back = 3 AND
(dum != ‘0′ OR
SUBSTR(satu,(idn-1),1) != ‘0′
OR SUBSTR(satu,(idn-2),1) != ‘0′) THEN
atr := atr || ‘ribu ‘;
END IF;
IF (back = 2 OR back = 5 OR back = 8 OR back =
11) AND dum != ‘0′ THEN
atr := atr || ‘ratus ‘;
END IF;
IF (back = 1 OR back = 4 OR back = 7 OR back =
10) AND dum != ‘0′ THEN
atr := atr || ‘puluh ‘;
END IF;
total1 := total1 || atr;
EXIT WHEN back = 0;
END LOOP;
IF LENGTH(dua) > 0 THEN
FOR i IN 1..LENGTH(dua)
LOOP
dum := SUBSTR(dua,i,1);
IF dum = ‘1′ THEN
atr := ‘Satu ‘;
END IF;
IF dum = ‘2′ THEN
atr := ‘Dua ‘;
END IF;
IF dum = ‘3′ THEN
atr := ‘Tiga ‘;
END IF;
IF dum = ‘4′ THEN
atr := ‘Empat ‘;
END IF;
IF dum = ‘5′THEN
atr := ‘Lima ‘;
END IF;
IF dum = ‘6′ THEN
atr := ‘Enam ‘;
END IF;
IF dum = ‘7′ THEN
atr := ‘Tujuh ‘;
END IF;
IF dum = ‘8′ THEN
atr := ‘Delapan ‘;
END IF;
IF dum = ‘9′ THEN
atr := ‘Sembilan ‘;
END IF;
IF dum = ‘0′ THEN
atr := ‘Nol ‘;
END IF;
total2 := total2 || atr;
END LOOP;
END IF;
IF LENGTH(dua) > 0 THEN
total := total1 || ‘koma ‘ || total2;
ELSE
total := total1;
END IF;
RETURN(total);
END;
/
Thank’s
mudah2an bisa membantu…!
Agustus 16, 2007 at 3:22 am
Mas tolong cantumkan sumber kode di atas. Itu adalah hasil pemikiran, jadi hargailah kekayaan intelektual orang.
ok trima kasih sebelumnya mas…sebetulnya bukannya saya tidak menghargai pemikiran orang lain tetapi code ini saya lupa dapat dari mana and saya kebetulan sudah lama saya taruh di PC saya makanya untuk ingat2 saja sebetulnya takut ilang makanya saya taruh diblog saya ini..:-) jadi saya minta maaf sebelumnya bukan maksd untuk memanipulasi atow mksd laen…
thx
Sumber code diatas :
http://ibrahim.burhan.biz/2007/02/13/oracle-package-untuk-fungsi-terbilang-repost/
Agustus 17, 2007 at 6:21 am
Ini link yang berisi kode di atas.
http://ibrahim.burhan.biz/2007/02/13/oracle-package-untuk-fungsi-terbilang-repost/
Header bagian atas telah dihilangkan sebagian.
Thanks,
Ibrahim
Agustus 20, 2007 at 2:34 am
Thanks.
Saya menghargai apa yang telah dilakukan. Semoga kita tetap memiliki keinginan berbagi dan menghargai karya orang lain.
Thanks,
ibrahim