Konversi Numerik Keterbilang

Seringkali kita menemukan di invoice, kwitansi atau surat bukti pembayaran lainnya. Nominal uang disamping ditulis dalam angka numerik juga ditulis dalam format terbilang. Misal 1.250.000,00 ditulis dalam format terbilang 'satu juta dua ratus lima puluh ribu rupiah'.

Untuk menyelesaikan masalah diatas berikut adalah sebuah modul program konversi terbilang menggunakan VB.Net.


Module ModTerbilang

Public Function TerbilangIndonesia(ByVal InputCurrency As String, _
Optional ByVal MataUang As String = "rupiah") As String
Dim strInput As String
Dim strBilangan As String
Dim strPecahan As String
On Error GoTo Pesan
Dim strValid As String
Dim huruf As String
Dim i As Integer
Dim AngkaTerbilang As String
'Periksa setiap karakter yg diketikkan ke kotak UserID
strValid = "1234567890."
For i% = 1 To Len(InputCurrency)
huruf = Chr(Asc(Mid(InputCurrency, i%, 1)))
If InStr(strValid, huruf) = 0 Then
AngkaTerbilang = Nothing
MsgBox("Harus karakter angka!", _
vbCritical, "Karakter Tidak Valid")

End If
Next i%

If InputCurrency = "" Then

End If
If Len(Trim(InputCurrency)) > 15 Then GoTo Pesan

strInput = CStr(InputCurrency) 'Konversi ke string
'Periksa apakah ada tanda "," jika ya berarti pecahan
If InStr(1, strInput, ".", vbBinaryCompare) Then

strBilangan = Left(strInput, InStr(1, strInput, ".", vbBinaryCompare) - 1)
'strBilangan = Right(strInput, InStr(1, strInput, ".", vbBinaryCompare) - 2)
strPecahan = Trim(Right(strInput, Len(strInput) - Len(strBilangan) - 1))

If MataUang <> "" Then

'- Mengatasi kemungkinan adanya nilai sen yang > 99 atau
' memiliki digit pecahan lebih dari 2 digit, maka pecahan
' tersebut dibulatkan ke kelipatan terdekat sebanyak 2 digit.
' Contoh: TerbilangDesimal("20,599") -> menampilkan MataUang
' dibulatkan menjadi: 20,60 -> dibaca menjadi:
' "Dua Puluh Rupiah Enam Puluh Sen" dan BUKAN:
' "Dua Puluh Rupiah Enam Sen".
' Hal ini berlaku hanya yg menampilkan MataUang.
If CLng(Trim(strPecahan)) > 99 Then
strInput = Format(Math.Round(CDbl(strInput), 2), "#0.00")
strPecahan = Format((Right(strInput, Len(strInput) - Len(strBilangan) - 1)), "00")
End If

'- Mengatasi kemungkinan jumlah digit sen yang hanya 1 angka.
' maka pecahan tersebut harus ditambahkan dengan nol virtual.
' Contoh: TerbilangDesimal("20,5") -> menampilkan MataUang
' dibulatkan menjadi: 20,5 -> dibaca menjadi:
' "Dua Puluh Rupiah Lima Puluh Sen" dan BUKAN:
' "Dua Puluh Rupiah Lima Sen".
' Hal ini berlaku hanya yg menampilkan MataUang.
If Len(Trim(strPecahan)) = 1 Then
strInput = Format(Math.Round(CDbl(strInput), 2), "#0.00")
strPecahan = Format((Right(strInput, Len(strInput) - Len(strBilangan) - 1)), "00")
End If

'Yang ini ditutup, untuk memperbaiki ejaan sesudah tanda
'koma (pecahan)...
'TerbilangDesimal = (KonversiBilangan(strBilangan) & "koma " & KonversiBilangan(strPecahan) & "rupiah")

'-------------------------------------------------------
'- Membetulkan ejaan untuk bilangan setelah tanda koma,
' sebelumnya menggunakan KonversiBilangan, kini memakai
' KonversiPecahan (setiap 1 angka dibaca satu per satu)
'- Membuat parameter "MataUang" yg bersifat opsional,
' di mana default-nya = "rupiah". Jika parameter ini
' dikosongkan dengan "" maka kata "rupiah" tidak muncul.

'- Menangani kemungkinan ejaan sen jika menggunakan
' mata uang rupiah, di mana nilai sen harus di antara
' mulai 1 dan 99. (Kemungkinan I)
' Contoh: TerbilangDesimal("20,99")
' "Dua Puluh Rupiah Sembilan Puluh Sembilan Sen".
'- Menangani kemungkinan ejaan desimal tanpa menggunakan
' mata uang rupiah, di mana nilai desimal dieja per satu
' karakter. (Kemungkinan II)
' Contoh: TerbilangDesimal("20,99", "")
' "Dua Puluh Koma Sembilan Sembilan")

'BANDINGKAN Kemungkinan I dan Kemungkinan II...

'MULAI PERIKSA >>>>>>
'Jika tanpa parameter MataUang (default), berarti akan
'menampilkan kata "Rupiah" dan perhatikan pula penanganan
'ejaan untuk sen. Lihat contoh Kemungkinan I di atas...

'Periksa lagi kemungkinan adanya angka: 20,00
'seharusnya: "Dua Puluh Rupiah"
' dan BUKAN "Dua Puluh Rupiah Sen"
'Jika pemeriksaan berikut ini tidak ada, maka 20,00
'akan dibaca dengan: "Dua Puluh Rupiah Sen"
If CLng(Trim(strPecahan)) = 0 Then
TerbilangIndonesia = (KonversiBilangan(strBilangan) & MataUang & " " & KonversiBilangan(strPecahan))
Else
TerbilangIndonesia = (KonversiBilangan(strBilangan) & MataUang & " " & KonversiBilangan(strPecahan) & "sen")
End If
Else
TerbilangIndonesia = (KonversiBilangan(strBilangan) & "koma " & KonversiPecahan(strPecahan))
End If

Else

TerbilangIndonesia = (KonversiBilangan(strInput))

End If
Exit Function
Pesan:
TerbilangIndonesia = "(maksimal 15 digit)"
End Function



Private Function KonversiPecahan(ByVal strAngka As String) As String
Dim i%, strJmlHuruf$, Urai$, Kar$
If strAngka = "" Then
KonversiPecahan = ""
End If
strJmlHuruf = Trim(strAngka)
Urai = ""
Kar = ""
For i = 1 To Len(strJmlHuruf)
'Tampung setiap satu karakter ke Kar
Kar = Mid(strAngka, i, 1)
Urai = Urai & Kata(CInt(Kar))
Next i
KonversiPecahan = Urai
End Function

Private Function Kata(ByVal angka As Byte) As String

Dim kata1 As String = ""
Select Case angka
Case 1 : kata1 = "satu "
Case 2 : kata1 = "dua "
Case 3 : kata1 = "tiga "
Case 4 : kata1 = "empat "
Case 5 : kata1 = "lima "
Case 6 : kata1 = "enam "
Case 7 : kata1 = "tujuh "
Case 8 : kata1 = "delapan "
Case 9 : kata1 = "sembilan "
Case 0 : kata1 = "nol "
End Select
Return kata1
End Function

Private Function KonversiBilangan(ByVal strAngka As String) As String
Dim strJmlHuruf As String
Dim intPecahan As Integer = 0
Dim strPecahan As String = ""
Dim Urai As String = ""
Dim Bil1 As String = ""
Dim strTot As String = ""
Dim Bil2 As String = ""
Dim X, Y, z As Integer

If strAngka = "" Then
KonversiBilangan = ""
End If

strJmlHuruf = Trim(strAngka)
X = 0
Y = 0
Urai = ""
While
 (X < x =" X" strtot =" Mid(strJmlHuruf," y =" Y" z =" 
Len(strJmlHuruf)" bil1 = "NOL " z =" 1" z =" 7" z =" 10" z =" 13)" bil1 =
 "satu " z =" 4)" x =" 1)" bil1 = "se" bil1 = "satu " z =" 2" z =" 5" z 
=" 8" z =" 11" z =" 14)" x =" X" strtot =" Mid(strJmlHuruf," z =" 
Len(strJmlHuruf)" bil2 = "" bil1 = "sepuluh " bil1 = "sebelas " bil1 = 
"dua belas " bil1 = "tiga belas " bil1 = "empat belas " bil1 = "lima 
belas " bil1 = "enam belas " bil1 = "tujuh belas " bil1 = "delapan belas
 " bil1 = "sembilan belas " bil1 = "se" bil1 = "dua " bil1 = "tiga " 
bil1 = "empat " bil1 = "lima " bil1 = "enam " bil1 = "tujuh " bil1 = 
"delapan " bil1 = "sembilan " bil1 = ""> 0) Then
If (z = 2 Or z = 5 Or z = 8 Or z = 11 Or z = 14) Then
Bil2 = "puluh "
ElseIf (z = 3 Or z = 6 Or z = 9 Or z = 12 Or z = 15) Then
Bil2 = "ratus "
Else
Bil2 = ""
End If
Else
Bil2 = ""
End If
If (Y > 0) Then
Select Case z
Case 4
Bil2 = Bil2 + "ribu "
Y = 0
Case 7
Bil2 = Bil2 + "juta "
Y = 0
Case 10
Bil2 = Bil2 + "milyar "
Y = 0
Case 13
Bil2 = Bil2 + "trilyun "
Y = 0
End Select
End If
Urai = Urai + Bil1 + Bil2
End While
KonversiBilangan = Urai
End Function

Private Function SpellDigit(ByVal strNumeric As Integer)
Dim cRet As String
On Error GoTo Pesan
cRet = ""
Select Case strNumeric
Case 0 : cRet = " zero"
Case 1 : cRet = " one"
Case 2 : cRet = " two"
Case 3 : cRet = " three"
Case 4 : cRet = " four"
Case 5 : cRet = " five"
Case 6 : cRet = " six"
Case 7 : cRet = " seven"
Case 8 : cRet = " eight"
Case 9 : cRet = " nine"
Case 10 : cRet = " ten"
Case 11 : cRet = " eleven"
Case 12 : cRet = " twelve"
Case 13 : cRet = " thirteen"
Case 14 : cRet = " fourteen"
Case 15 : cRet = " fifteen"
Case 16 : cRet = " sixteen"
Case 17 : cRet = " seventeen"
Case 18 : cRet = " eighteen"
Case 19 : cRet = " ninetieen"
Case 20 : cRet = " twenty"
Case 30 : cRet = " thirty"
Case 40 : cRet = " fourthy"
Case 50 : cRet = " fifty"
Case 60 : cRet = " sixty"
Case 70 : cRet = " seventy"
Case 80 : cRet = " eighty"
Case 90 : cRet = " ninety"
Case 100 : cRet = " one hundred"
Case 200 : cRet = " two hundred"
Case 300 : cRet = " three hundred"
Case 400 : cRet = " four hundred"
Case 500 : cRet = " five hundred"
Case 600 : cRet = " six hundred"
Case 700 : cRet = " seven hundred"
Case 800 : cRet = " eight hundred"
Case 900 : cRet = " nine hundred"
End Select
SpellDigit = cRet
Exit Function
Pesan:
SpellDigit = "(maksimal 9 digit)"
End Function

Private Function SpellUnit(ByVal strNumeric As Integer)
Dim cRet As String
Dim n100 As Integer
Dim n10 As Integer
Dim n1 As Integer
On Error GoTo Pesan
cRet = ""
n100 = Int(strNumeric / 100) * 100
n10 = Int((strNumeric - n100) / 10) * 10
n1 = (strNumeric - n100 - n10)
If n100 > 0 Then
cRet = SpellDigit(n100)
End If
If n10 > 0 Then
If n10 = 10 Then
cRet = cRet & SpellDigit(n10 + n1)
Else
cRet = cRet & SpellDigit(n10)
End If
End If
If n1 > 0 And n10 <> 10 Then
cRet = cRet & SpellDigit(n1)
End If
SpellUnit = cRet
Exit Function
Pesan:
SpellUnit = "(maksimal 9 digit)"
End Function

Public Function TerbilangInggris(ByVal strNumeric As String) As String
Dim cRet As String
Dim n1000000 As Long
Dim n1000 As Long
Dim n1 As Integer
Dim n0 As Integer
On Error GoTo Pesan
Dim strValid As String = ""
Dim huruf As String = ""
Dim i As Integer
'Periksa setiap karakter masukan
strValid = "1234567890.,"
For i% = 1 To Len(strNumeric)
huruf = Chr(Asc(Mid(strNumeric, i%, 1)))
If InStr(strValid, huruf) = 0 Then
MsgBox("Harus karakter angka!", _
vbCritical, "Karakter Tidak Valid")
TerbilangInggris = ""
End If
Next i%

If strNumeric = "" Then
TerbilangInggris = ""
End If
If Len(Trim(strNumeric)) > 9 Then GoTo Pesan

cRet = ""
n1000000 = Int(strNumeric / 1000000) * 1000000
n1000 = Int((strNumeric - n1000000) / 1000) * 1000
n1 = Int(strNumeric - n1000000 - n1000)
n0 = (strNumeric - n1000000 - n1000 - n1) * 100
If n1000000 > 0 Then
cRet = SpellUnit(n1000000 / 1000000) & " million"
End If
If n1000 > 0 Then
cRet = cRet & SpellUnit(n1000 / 1000) & " thousand"
End If
If n1 > 0 Then
cRet = cRet & SpellUnit(n1)
End If
If n0 > 0 Then
cRet = cRet & " and cents" & SpellUnit(n0)
End If
TerbilangInggris = cRet & " only"
Exit Function
Pesan:
TerbilangInggris = "(maximum 9 digit)"
End Function

End Module

No comments:

Post a Comment