Menterjemahkan Angka Romawi dengan Visual Foxpro
&& FUNCTION Rom2Lat
&& PARAMETERS _cBil,_Mode
&& Function Rom2Lat
&& Untuk merubah angka romawi menjadi bilBulPos Latin&& Parameter _cBil,_Mode
&& _cBil Angka Romawi
&& _Mode untuk menentuka Nlai Return, _Mode berupa 0 atau 1
&& Return : Jika _Mode=0, BilBulPos, -1 jika tak dapat diterjemahkan
&& Jika _Mode=1, Expresi String dari Bil
&& Contoh :
&& Rom3Lat(XII) ==> 12
&& Rom2Lat("YZ") ==> -1
&& Rom2Lat("XII",1) ==> "10+1+1"
&& Catatan : Function BacaDrKanan()
FUNCTION Rom2Lat
PARAMETERS _cBil,_Mode
IF VARTYPE(_cBil)<>"C"
RETURN -1
ENDIF
IF LEN(_cBil)>99
RETURN -1
ENDIF
IF VARTYPE(_Mode)="C"
_Mode=VAL(_Mode)
ENDIF
IF VARTYPE(_Mode)<>"N"
_Mode=0
ENDIF
IF _Mode<=0 .or. _Mode>1
_Mode=0
ENDIF
_cBil=BacaDrKanan(HapusBlank(_cBil))
_ncBil=LEN(_cBil)
_BalikRom=""
FOR _kesekian=1 TO _ncBil
_CharKei=SUBSTR(_cBil,_kesekian,1)
_vKei=CharRom2Lat(_CharKei)
IF _kesekian<_ncBil
_NexChar=SUBSTR(_cBil,_kesekian+1,1)
_vNexChar=CharRom2Lat(_NexChar)
IF _vNexChar<_vKei
_BalikRom=_BalikRom+ALLTRIM(STR(_vKei))+"-"
ELSE
_BalikRom=_BalikRom+ALLTRIM(STR(_vKei))+"+"
ENDIF
ELSE
_BalikRom=_BalikRom+ALLTRIM(STR(_vKei))
ENDIF
NEXT
IF _Mode=1
RETURN _BalikRom
ENDIF
RETURN INT(Trump(_BalikRom))
&& FUNCTION Trump
&& Ini merupakan subfunction untuk function Rom2Lat
&& Untuk memnterjenahkan String berisi + dan - menjadi operasi &
&& Contoh :
&& Trump("11+10+2-2") ===> 21
&& Sama atrinya jika kita pakai & sbb :
&& xx="11+10+2-2"
&& ? &xx ===> 21
&& Trump tidak dapat dipergunakan untuk string dengan operasi perkalian atau pembagian
FUNCTION Trump
PARAMETERS _BalikRom
_Kali=1000
_nBalik=0
_BalikRom=_BalikRom
DO WHILE _Kali>1
_PosPlus=RAT("+",_BalikRom)
_PosMin=RAT("-",_BalikRom)
DO CASE
CASE _PosPlus>_PosMin && Tanda + ada di belakang
_StringNBuncit=VAL(SUBSTR(_BalikRom,_PosPlus+1))
_nBalik=_nBalik+_StringNBuncit
_BalikRom=LEFT(_BalikRom,_PosPlus-1)
CASE _PosPlus<_PosMin
_StringNBuncit=VAL(SUBSTR(_BalikRom,_PosMin+1))
_nBalik=_nBalik-_StringNBuncit
_BalikRom=LEFT(_BalikRom,_PosMin-1)
CASE _PosPlus=0 .and. _PosMin=0
_StringNBuncit=VAL(_BalikRom)
_nBalik=_nBalik+_StringNBuncit
_BalikRom=""
EXIT
ENDCASE
_Kali=_Kali-1
ENDDO
RETURN _nBalik
&& Function CharRom2Lat
&& Untuk merubah 1 digit angka dasar romawi menjadi bilBulPos Latin
&& Parameter _cBil Angka Dasar Romawi (I,V,X, L,C,D,M)
&& Return : BilBulPos, 1 atau 5 atau 10, 50 atau 100 atau 500 atau 1000
&& Contoh :
&& Rom3Lat("C") ==> 100
&& Rom2Lat("c") ==> 100
FUNCTION CharRom2Lat
PARAMETERS _cBil
IF VARTYPE(_cBil)<>"C"
RETURN -1
ENDIF
_cBil=UPPER(HapusBlank(_cBil))
DO CASE
CASE _cBil="V"
_Balik=5
CASE _cBil="X"
_Balik=10
CASE _cBil="L"
_Balik=50
CASE _cBil="C"
_Balik=100
CASE _cBil="D"
_Balik=500
CASE _cBil="M"
_Balik=1000
OTHERWISE
_Balik=1
ENDCASE
RETURN _Balik
0 komentar:
Posting Komentar