Mengubah angka menjadi huruf python

terbilang

terbilang adalah sebuah alat yang berfungsi untuk mengubah angka menjadi huruf terbilang. terbilang ditulis dengan Python dan dapat menerima masukan angka hingga 72 digit (999+ miliar novemdesiliun).

Instalasi

Penggunaan

terbilang dapat dijalankan langsung sebagai skrip Python:

Jika anda adalah pengembang, terbilang juga bisa digunakan sebagai modul:

from terbilang import Terbilang

t = Terbilang()

t.parse('1.000,00')
print(t.getresult()) # seribu koma nol nol

t.parse('1001')
print(t.getresult()) # seribu satu

t.parse('121001')
print(t.getresult()) # seratus dua puluh satu ribu satu

Standar pemisah desimal yang digunakan oleh terbilang adalah koma (,), ini bisa diganti pada saat inisiasi:

t = Terbilang(sep='.')

print(t.parse('1000.456').getresult()) # seribu koma empat lima enam

terbilang dibuat agar memiliki jangkauan yang lebar, tetapi diharapkan dapat membaca angka dengan lebih luwes. Sebagai contoh, "1000 triliun" tidak dibaca sebagai "satu kuadriliun" tetapi "seribu triliun". Sedangkan "1000 juta" tentu akan dibaca sebagai "satu miliar". terbilang akan menampilkan tanda koma jika bilangan sudah mencapai triliunan atau lebih untuk meningkatkan keterbacaan:

t.parse('19000000000000000000071000002011000000')
print(t.getresult()) # sembilan belas undesiliun, tujuh puluh satu ribu triliun, dua miliar sebelas juta

Mengerjakan suatu project yang berhubungan dengan keuangan, ada client yang meminta aplikasi yang dibuat bisa menerbitkan kuitansi atau surat tertentu. Pada kuitansi misalnya, ada nominal rupiah yang ditulis dalam bilangan atau teks. Dan juga tanggal dibuat dalam kalimat. Yang biasa kita sebut terbilang. Mari kita coba membuat fungsi terbilang rupiah dan tanggal python.

Daftar Isi

Fungsi Terbilang Rupiah

Jadi, pada pembuatan fungsi terbilang rupiah ini. Kita akan mengubah angka menjadi kalimat, misal angka 1 diubah menjadi tulisan satu. Yang pertama kita lakukan adalah mendefinisikan huruf/kata-kata berupa list yang disimpan dalam sebuah variable.

Langsung saja kita akan membuat kodenya, yang ini akan saya simpan pada file bernama terbilang.py.

class Terbilang:
    def __init__(self) -> None:
        self.huruf = [
            '', 'satu', 'dua', 'tiga', 'empat', 'lima', 'enam',
            'tujuh', 'delapan', 'sembilan', 'sepuluh', 'sebelas'
        ]
  • Pertama, membuat sebuah class Terbilang:.
  • Didalam class ini memiliki __init__ untuk inisialisasi.

Kemudian saya membuat function pilih_huruf, masih di dalam class Terbilang.

    def pilih_huruf(self, num):
        if num < 12:
            temp = ' ' + self.huruf[num]
        elif num < 20:
            temp = str(self.pilih_huruf(num - 10)) + ' belas'
        elif num < 100:
            temp = str(self.pilih_huruf(num // 10)) + ' puluh' + str(self.pilih_huruf(num % 10))
        elif num < 200:
            temp = 'seratus' + str(self.pilih_huruf(num - 100))
        elif num < 1000:
            temp = str(self.pilih_huruf(num // 100)) + ' ratus' + str(self.pilih_huruf(num % 100))
        elif num < 2000:
            temp = 'seribu' + str(self.pilih_huruf(num - 1000))
        elif num < 1000000:
            temp = str(self.pilih_huruf(num // 1000)) + ' ribu' + str(self.pilih_huruf(num % 1000))
        elif num < 1000000000:
            temp = str(self.pilih_huruf(num // 1000000)) + ' juta' + str(self.pilih_huruf(num % 1000000))
        elif num < 1000000000000:
            temp = str(self.pilih_huruf(num // 1000000000)) + ' milyar' + str(self.pilih_huruf(num % 1000000000))
        elif num < 1000000000000000:
            temp = str(self.pilih_huruf(num // 1000000000000)) + ' trilyun' + str(self.pilih_huruf(num % 1000000000000))
        return temp

Pada function pilih_huruf() bertugas untuk memilih kata yang tepat berdasarkan angka yang didapat dari argument num argument num harus bertype int. Pada fungsi ini, untuk menentukan kata yang tepat, menggunakan operator pembagian bulat (//) dan sisa bagi (%) pada angka di atas 19 hingga trilyun. Dan untuk angka 19 ke bawah hanya dikurang 10 saja.

Misal, kita memberikan angka 321, maka fungsi pilih_huruf() akan memisahkan angka tersebut menjadi ratursan, puluhan, dan satuan dengan cara membandingkan kondisinya pada statement if. Setelah masuk block if yang sesuai dengan kondisinya, lalu menjalankan operator yang ada dan menghasilkan nilai index untuk memilih huruf di variable list self.huruf. Kemudian diubah menjadi string agar bisa di combine atau concetenation.

Dari angka yang kita input tadi 321, berarti ini masuk ke block elif num < 1000. Selanjutnya menjalankan operator pembagian bulat 321 // 100 dan hasilnya adalah 3, yang ini berarti index ke 4 dari list self.huruf. Pada index ke 4 dari self.huruf adalah "tiga", kemudian diubah menjadi string lalu concetenation dengan string "ratus" yang menghasilkan kata "tiga ratus".

Dari angka 321 tadi, dan masih diblock yang sama, selanjutnya melakukan operasi sisa bagi. Dari operasi sisa bagi 321 % 100 hasilnya adalah 21. Angka 21 ini masuk ke block elif num < 100:. Kembali menjalankan operasi pembagian bulat yang hasilnya 21 // 10 adalah 2, memilih index ke 3 dari self.huruf, diubah menjadi string lalu concetenate lagi dengan string "puluh". Yang menghasilkan string "dua puluh".

Masih di block elif num < 100:, juga menjalankan operator sisa bagi 21 % 10 hasilnya 1 memilih list self.huruf pada index ke 2 adalah string "satu", diubah lagi menjadi string, karena ini masuk juga ke block if num < 12: maka di block ini tidak ada concetenate.

Hasil proses dari pilih_angka() disimpan dalam variable temp dan dikembalikan nilainya pada si pemanggil fungsi.

Masih di file yang sama yaitu terbilang.py dan di dalam class Terbilang. Buat fungsi lagi bernama terbilang(). Fungsi terbilang() ini, memiliki argument self dan num=None yaitu nilai default dari num adalah None. Pada fungsi terbilang(), berisi statement if. Yang memeriksa argument num, jika None yang direturn juga kosong.

    def terbilang(self, num: int = None):
        if num == None:
            hasil = ''
        elif num < 0:
            hasil = 'minus ' + self.pilih_huruf(abs(num))
        elif num == 0:
            hasil = 'nol'
        else:
            hasil = self.pilih_huruf(num)
        return hasil

Pada block elif num < 0:, artinya jika pada argument num ternyata nilainya adalah minus, misal -12. Maka kembaliannya akan ditambah kata "minus" kemudian angka yang minus tadi kita jadikan absolut dengan fungsi abs. Jadi, fungsi abs() mengubah suatu angka atau bilangan menjadi rill, agar bisa diproses pada fungsi pilih_huruf().

Block selanjutnya elif num == 0:, pada num yang bernilai 0, langsung saja dikembalikan dengan kata "nol". Dan Selain dari kondisi di atas, fungsi terbilang() akan memanggil fungsi pilih_huruf() untuk memproses nilai num.

Membuat Fungsi Terbilang Tanggal

Tanggal juga ternyata bisa dibuat menjadi kalimat terbilang. Biasanya dalam MoU, tanggal akan ditulis dengan huruf misalnya Pada hari ini, senin tanggal dua belas bulan januari tahun dua ribu dua puluh dua dari pada menuliskan seperti biasanya Senin, 12 Januari 2022.

Untuk melakukan itu, kita masih menggunakan fungsi terbilang() dan juga fungsi pilih_huruf(). Dan di sini, kita tambahkan satu fungsi lagi bernama terbilang_tanggal().

    def terbilang_tanggal(self, tgl):
        hari = tgl.strftime("%A")
        tanggal = self.terbilang(int(tgl.strftime("%d")))
        bulan = tgl.strftime("%B")
        tahun = self.terbilang(int(tgl.strftime("%Y")))
        hasil = str(hari) + ' tanggal ' + str(tanggal) + ' bulan ' + str(bulan) + ' tahun ' + str(tahun)
        return hasil
  • Oke, fungsi terbilang_tanggal() memiliki argument tgl, yang menerima nilai berupa date().
  • Kemudian, variable hari ambil nama hari saja.
  • variable tanggal ambil nilai tanggal dari tgl, kemudian ubah menjadi int dan diproses oleh fungsi terbilang(), untuk dijadikan kata.
  • variable bulan hanya mengambil nama bulan dari tgl.
  • variable tahun prosesnya seperti pada variable tanggal. Yang diambil di sini adalah tahunnya saja.
  • variabel hasil melakukan concatenate dari semua variabel yang sudah didefinisikan sebelumnya.
  • Dan kembalikan nilainya/hasilnya kepada sipemanggil fungsi

Menjalankan Program Python dari Shell

Selesai kita membuat program, sekarang sampai ditahap uji coba. Apakan berjalan dengan baik atau tidak. Untuk menjalankan program python yang sudah kita buat ini, bisa melalui python shell. Caranya dengan ketik python.

Kemudian import class Terbilang dan juga import date, dan membuat variable kalimat untuk menyimpan class Terbilang.

from terbilang import Terbilang
from datetime import date

kalimat = Terbilang()

Saya import date() karena nanti juga kita akan mencoba fungsi terbilang_tanggal()

Oke, kita coba dulu fungsi terbilang(), saya akan mencoba mengubah bilangan 3241 menjadi terbilang. Caranya adalah kalimat.terbilang(3241). Kemudian coba juga fungsi terbilang_tanggal(). Coba kita ubah tanggal hari ini menjadi terbilang. kalimat.terbilang_tanggal(date.today()). Atau untuk tanggal lain adalah kelimat.terbilang_tanggal(date(2019, 3, 26)) formatnya tahun, bulan, tanggal.

Sampai sejauh ini program kita berjalan tanpa error. Tapi, nama hari dan nama bulan ternyata dalam bahasa inggris. Dan tentu saja kita harus perbaiki masalah ini.

EDIT: Fungsi Terbilang Tanggal

Kita bisa menggunakan locale untuk menterjemahkannya dan install bahasa yang diinginkan (Bahasa Indonesia). Tapi saya lebih memilih menggunakan modul yang bernama Babel tanpa harus menginstall bahasa, install di virtual environment kalian dengan pip install Babel.

Dan, buka kembali file terbilang.py dan ubah menjadi seperti ini. Jangan lupa import dulu Babel dan re, tulis di bagian atas.

from babel.dates import format_date
from re import findall

class Terbilang:
.......


.......
    # terbilang_tanggal() yang sudah di edit
    def terbilang_tanggal(self, tgl):
        frmt = format_date(tgl, format='full', locale='id_ID')
        num = ''.join(findall(r'\s|,|[^,\s]+', frmt)).split()
        hari = num[0]
        tanggal = self.terbilang(int(num[1]))
        bulan = num[2]
        tahun = self.terbilang(int(num[3]))
        hasil = str(hari) + ' tanggal' + str(tanggal) + ' bulan ' + str(bulan) + ' tahun ' + str(tahun)
        return hasil

Dan fungsi terbilang_tanggal() sudah kita perbaiki, saatnya kita coba.

Pada fungsi terbilang_tanggal() yang baru ini, tetap memiliki satu argument yaitu tgl. Pada prosesnya berbeda dari sebelumnya.

  • Pada variabel frmt melakukan format tanggal dengan fungsi format_date(). Argument pertama dari format_date() adalah tanggal(date()), kemudian formatnya, kita akan ubah formatnya jadi "full" agar bisa menampilkan nama hari juga. Selain "full" bisa juga membuat custom pattern, silahkan lihat dokumentasi Babel. Lalu argument ke tiga adalah locale, yaitu kita mengakses bahasa, varian, time zone, dan lainnya. Tapi kita hanya butuh bahasa saja.
  • Kita kepada variable num di sini, kita akan split nilai dari frmt. Nilai dari frmt adalah string misal: "Rabu, 23 Februari 2022". Hasilnya menjadi list. num = ['Rabu', '23', 'Februari', '2022']
  • Pada variable hari, tanggal, bulan, dan tahun. Ini prosesnya sama seperti yang sebelumnya. Hanya berbeda pada pemilihan data yang akan diproses.
  • Karena data yang akan diproses berupa list, maka kita tentukan ada di index ke berapa data yang benar itu. Misalnya hari ada di index pertama, dan seterusnya.

Full Kode Fungsi Terbilang Python

Kalau di atas, kodenya terpotong-potong mungkin ada yang belum paham. Berikut full kode fungsi terbilang python versi yang sudah diperbarui.

# file terbilang.py
from babel.dates import format_date
from re import findall

class Terbilang:
    def __init__(self) -> None:
        self.huruf = [
            '', 'satu', 'dua', 'tiga', 'empat', 'lima', 'enam',
            'tujuh', 'delapan', 'sembilan', 'sepuluh', 'sebelas'
        ]
    
    def pilih_huruf(self, num):
        if num < 12:
            temp = ' ' + self.huruf[num]
        elif num < 20:
            temp = str(self.pilih_huruf(num - 10)) + ' belas'
        elif num < 100:
            temp = str(self.pilih_huruf(num // 10)) + ' puluh' + str(self.pilih_huruf(num % 10))
        elif num < 200:
            temp = 'seratus' + str(self.pilih_huruf(num - 100))
        elif num < 1000:
            temp = str(self.pilih_huruf(num // 100)) + ' ratus' + str(self.pilih_huruf(num % 100))
        elif num < 2000:
            temp = 'seribu' + str(self.pilih_huruf(num - 1000))
        elif num < 1000000:
            temp = str(self.pilih_huruf(num // 1000)) + ' ribu' + str(self.pilih_huruf(num % 1000))
        elif num < 1000000000:
            temp = str(self.pilih_huruf(num // 1000000)) + ' juta' + str(self.pilih_huruf(num % 1000000))
        elif num < 1000000000000:
            temp = str(self.pilih_huruf(num // 1000000000)) + ' milyar' + str(self.pilih_huruf(num % 1000000000))
        elif num < 1000000000000000:
            temp = str(self.pilih_huruf(num // 1000000000000)) + ' trilyun' + str(self.pilih_huruf(num % 1000000000000))
        return temp
    
    def terbilang(self, num: int = None):
        if num == None:
            hasil = ''
        elif num < 0:
            hasil = 'minus ' + self.pilih_huruf(abs(num))
        elif num == 0:
            hasil = 'nol'
        else:
            hasil = self.pilih_huruf(num)
        return hasil
    
    def terbilang_tanggal(self, tgl):
        frmt = format_date(tgl, format='full', locale='id_ID')
        num = ''.join(findall(r'\s|,|[^,\s]+', frmt)).split()
        hari = num[0]
        tanggal = self.terbilang(int(num[1]))
        bulan = num[2]
        tahun = self.terbilang(int(num[3]))
        hasil = str(hari) + ' tanggal' + str(tanggal) + ' bulan ' + str(bulan) + ' tahun ' + str(tahun)
        return hasil

Menjalankan Python dengan Script Mode

Sekarang saya ingin menjalankan program yang kita buat tadi dengan cara berbeda. Kita juga bisa membuatnya menjadi interaktif. Tidak seperti sebelumnya, tapi tetap bisa dijalankan dengan cara sebelumnya, namun harus diimport ulang class Terbilang untuk memperbarui perubahan ke memory.

Pertama, kita buat file bernama program.py (atau apa saja), dan menulis kode seperti berikut.

# file program.py
from datetime import date
from terbilang import Terbilang

terbilang = Terbilang()

print("")
print("Silahkan pilih fungsi yang ingin dijalankan: ")
print("")
print("============================================")
print("1 = Fungsi Terbilang")
print("2 = Fungsi Terbilang Tanggal")
print("")

def pilih_fungsi():
    pilih = 0

    while not pilih:
        try:
            pilih = int(input('Pilih 1 atau 2? '))

            if pilih not in(1,2):
                raise ValueError

            if pilih == 1:
                print("")
                print("ketik end untuk keluar")
                print("")
                angka = ''

                while not angka:
                    try:
                        print("Sekarang masukkan angka untuk di conversi")
                        angka = input("Masukkan angka = ")
                        
                        if angka == "end":
                            print("Keluar Program")
                            raise SystemExit
                        
                        cek = terbilang.terbilang(int(angka))
                        hasil = "fungsi terbilang angka {a} adalah: {h}".format(a=angka, h=cek)
                        angka = ''
                        
                        print(hasil)
                        print("")

                    except ValueError:
                        angka = ''
                        print("Masukkan angka saja!")


            if pilih == 2:
                print("")
                print("ketik end untuk keluar")
                print("")
                tanggal = ''

                while not tanggal:
                    try:
                        print("Sekarang masukkan tanggal untuk di conversi")
                        tanggal = input("format tanggal 'DD-MM-YYYY' = ")
                        
                        if tanggal == "end":
                            print("Keluar Program")
                            raise SystemExit

                        day, month, year = map(int, tanggal.split('-'))
                        tanggal1 = date(year, month, day)

                        cek = terbilang.terbilang_tanggal(tanggal1)
                        hasil = "fungsi terbilang tanggal {a} adalah: {h}".format(a=tanggal, h=cek)

                        tanggal = ''
                        print(hasil)
                        print("")
                        
                    except ValueError:
                        tanggal = ''
                        print("Masukkan tanggal saja! dengan format 'DD-MM-YYYY'")
        except ValueError:
            pilih = 0
            print("Masukkan pilihan dengan angka 1 atau 2 saja!")

pilih_fungsi()

File program.py, kita hanya buat satu fungsi saya yaitu pilih_fungsi() tanpa argument.

Dari baris pertama hingga baris 13, kita semua sudah mengerti untuk apa. Langsung saja ke baris 15 yaitu fungsi pilih_fungsi(). Yang di pertama mendefinisikan sebuah variable pilih dengan nilai 0 sebagai inisiasi.

  1. Baris 18, menggunakan while untuk melakukan perulangan dengan while. While akan terus melakukan perulangan selama nilainya True.
  2. Baris 18, conditional statement try...except, hampir mirip seperti if..else namun dengan kepraktisan dalam mendeteksi error.
  3. Pada block try, variable pilih untuk membuat input dan dikonversi menjadi int.
  4. Setelah user menginput sesuatu, program akan menjalankan statement if yang apabila nilai pilih selain angka 1 dan 2. Program akan menampilkan pesan error yang ada di block exception baris ke 80.
  5. Saat nilai pilih adalah 1, block baris 25 akan dijalankan. Dan nilai pilih adalah 2, baris 52 yang akan dijalankan.
  6. Di dalam block if pilih == 1: juga diawali dengan inisiasi variable angka. Dan lagi menggunakan conditional while. Lalu user akan diminta untuk memasukkan angka, jika berupa angka, program akan memanggil fungsi terbilang yang tersimpan dalam variable cek.
  7. Ketika user mengetikkan "end" program akan keluar, yang dieksekusi pada baris ke 36.
  8. Untuk input selain angka dan end, program akan memunculkan exception di baris ke 47.
  9. Pada block if pilih == 2: baris ke 52 tidak jauh berbeda seperti pada baris ke 25. Yang membedakan hanya pada input saja.
  10. User harus input sesuai dengan format, jika tidak, akan menampilkan pesan error pada baris ke 77. Kalau format tanggal yang diinput sudah sesuai, program akan menconversi input yang masih berupa string menjadi type datetime di baris ke 67 dan 68.
  11. Melanjutkan proses memanggil fungsi terbilang_tanggal() pada baris ke 70, dan menyimpan kembalian dari fungsi terbilang_tanggal() di variable hasil. Baris ke 71.
  12. Baris ke 73, memperbarui variable tanggal dengan string kosong. Dan menampilkan hasilnya ke layar pada baris ke 74.
  13. Karena variable tanggal sudah kosong pada baris ke 73, ini berarti while di baris ke 58 menjadi True, maka akan kembali menampilkan input sampai user mengetikkan "end". Dan program akan exit().

Silahkan dicoba dengan python terbilang.py

Kesimpulan

Kita sudah berhasil membuat fungsi terbilang di python dengan kode yang agak panjang. Fungsi terbilang(), bisa digunakan untuk membuat kuitansi menyatakan nilai rupah dalam kalimat. Dan fungsi terbilang_tanggal() untuk mengconversi format tanggal menjadi kalimat.

Dalam menjalankan program python yang kita peragakan pada tulisan ini yaitu dari shell dan juga dengan script mode.

Untuk cara python shell harus diimport terlebih dahulu class Terbilang dan datetime jika mau menjalankan fungsi terbilang_tanggal().

Untuk script mode, tidak perlu mengimport apapun, hanya dengan perintah python nama_file.py