Oracle Package untuk fungsi ‘terbilang’ (repost)
Contoh penggunaan:
SELECT PKG_DIGIT_SPELLER.ENGRupiah('12345') FROM DUALSELECT PKG_DIGIT_SPELLER.ENGRupiah('12345.56') FROM DUAL
TWELVE THOUSAND THREE HUNDRED AND FOURTY-FIVE RUPIAHSTWELVE THOUSAND THREE HUNDRED AND FOURTY-FIVE RUPIAHS FIFTY-SIX
CREATE OR REPLACE PACKAGE PKG_DIGIT_SPELLER IS
/*******************************************************************************
Nama Package : PKG_DIGIT_SPELLER
Oleh : Ibrahim F Burhan (ibrahim@burhan.biz)
Deskripsi : Menghasilkan ucapan bilangan dalam bahasa Indonesia dan
Inggris
Hak Cipta Oleh Ibrahim F Burhan (ibrahim@burhan.biz) 2000
Siapa saja diperkenankan untuk memakai, mengubah ataupun mengembangkan
source code ini, dengan syarat tetap mencantumkan keterangan ini.
Reposted from my archive (Mar 16, 2001)
*******************************************************************************/
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_DIGIT_SPELLER 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 ;
Komentar
Posting Komentar