Halo! Kali ini, aku mau membahas tentang cara membuat komputer mengeja angka.
Ketika di tempat yang ada sistem antreannya, biasanya terdengar kalimat seperti ini, "Nomor antrean A-15 [a lima belas] harap datang ke loket 1 [satu]," atau seperti ini, "Panggilan bagi penumpang pesawat Garuda Indonesia dengan nomor penerbangan GA-410 [ge a empat satu nol] tujuan Denpasar. Silakan segera menuju pintu keberangkatan 5-A [lima a]."
Nah, apakah setiap kemungkinan bilangan itu direkam satu per satu? Tentu tidak, ya. Ada terlalu banyak kombinasi nomor atau kode yang mungkin sehingga akan memakan waktu, tenaga, dan biaya yang besar kalau harus merekam setiap kemungkinan. Yang dilakukan adalah merekam potongan demi potongan dan kemudian merangkai sesuai nomor atau kode yang diinginkan.
Untuk nama-nama kota/kabupaten tujuan, perekamannya tetap perlu satu per satu, tetapi cukup nama kotanya saja. Kalimat secara utuh juga direkam dengan merumpangkan bagian-bagian nomor penerbangan, tempat tujuan, dan nomor pintu.
Namun, untuk nama huruf dan nama angka, kita cukup merekam 36 kata (10 angka + 26 huruf) untuk menyusun banyak kombinasi nomor penerbangan dan nomor pintu. Bagaimana mengubah dari nomor atau kode tersebut menjadi bunyinya?
Pembahasan di bawah ini hanya ilustrasi. Penerapannya di lapangan bisa berbeda menyesuaikan keadaan dan keperluan.
Membuat Komputer Mengeja Angka
Berikut adalah definisi awal fungsi ejaAngka yang menerima satu parameter, yaitu teks yang berisi deretan angka yang hendak dieja. Alasan teks berupa String adalah agar yang bisa dibaca bisa cukup panjang dan tidak terbatas ukuran tipe data Number (sekitar 253 − 1, sekitar 9 kuadriliun). (Baca tulisanku sebelumnya, "Satuan Word dan Bita dalam Pemrograman" untuk mempelajari lebih lanjut.)
function ejaAngka(teks) {
// Ini agar teks selalu bertipe data String.
teks = String(teks);
// ...
}
Selanjutnya, kita menyiapkan tabel untuk tiap angka.
const namaAngka = {
"0": "nol",
"1": "satu",
"2": "dua",
"3": "tiga",
"4": "empat",
"5": "lima",
"6": "enam",
"7": "tujuh",
"8": "delapan",
"9": "sembilan",
};
Untuk selanjutnya, kita akan memecah teks menjadi larik berisi tiap karakter, kemudian mengubahnya menjadi nama angka, dan menggabungkannya kembali dengan spasi.
teks = teks
// Pecah menjadi larik berisi tiap karakter.
.split("")
// Ubah menjadi nama angka.
.map(c => namaAngka[c])
// Gabung kembali dengan spasi.
.join(" ");
Berikut adalah kode lengkapnya.
// Eja angka dalam bahasa Indonesia
function ejaAngka(teks) {
// Ini agar teks selalu bertipe data String.
teks = String(teks);
const namaAngka = {
"0": "nol",
"1": "satu",
"2": "dua",
"3": "tiga",
"4": "empat",
"5": "lima",
"6": "enam",
"7": "tujuh",
"8": "delapan",
"9": "sembilan",
};
teks = teks
// Pecah menjadi larik berisi tiap karakter.
.split("")
// Ubah menjadi nama angka.
.map(c => namaAngka[c])
// Gabung kembali dengan spasi.
.join(" ");
return teks;
}
Contoh hasilnya: Nomor 410 menjadi ???.
Bagaimana dengan Huruf?
Sebenarnya, sih, ini cukup sederhana. Yang perlu dilakukan adalah menambahkan cara baca huruf-huruf ke dalam tabel yang sudah ada itu. Agar lebih ringkas, semua huruf diubah ke dalam bentuk huruf kecil (atau besar, pilih salah satu).
Selain itu, bisa juga ditambahkan pemeriksaan agar karakter yang tidak dikenal cukup ditulis ulang tanpa perubahan. Berikut contohnya.
.map(c => namaKarakter.hasOwnProperty(c) ? namaKarakter[c] : c)
Berikut adalah kode lengkapnya.
// Eja angka dan huruf dalam bahasa Indonesia
function ejaAngkaHuruf(teks) {
// Ini agar teks selalu bertipe data String.
teks = String(teks);
// Teks diubah agar menggunakan huruf kecil.
teks = teks.toLowerCase();
const namaKarakter = {
"0": "nol",
"1": "satu",
"2": "dua",
"3": "tiga",
"4": "empat",
"5": "lima",
"6": "enam",
"7": "tujuh",
"8": "delapan",
"9": "sembilan",
"a": "a",
"b": "be",
"c": "ce",
"d": "de",
"e": "e",
"f": "ef",
"g": "ge",
"h": "ha",
"i": "i",
"j": "je",
"k": "ka",
"l": "el",
"m": "em",
"n": "en",
"o": "o",
"p": "pe",
"q": "qi",
"r": "er",
"s": "es",
"t": "te",
"u": "u",
"v": "ve",
"w": "we",
"x": "ex",
"y": "ye",
"z": "zet",
};
teks = teks
// Pecah menjadi larik berisi tiap karakter.
.split("")
// Ubah menjadi nama karakter kalau ada.
.map(c => namaKarakter.hasOwnProperty(c) ? namaKarakter[c] : c)
// Gabung kembali dengan spasi.
.join(" ");
return teks;
}
Contoh hasilnya: Nomor GA-410 menjadi ???.
Penutup
Teknik yang dibahas kali ini hanya substitusi sederhana, yaitu mengubah karakter demi karakter menjadi nama karakternya. Hal ini sudah cukup untuk sebagian kasus. Namun, ada kasus-kasus lain yang perlu lebih kompleks. Mungkin untuk tulisanku selanjutnya, kita bisa membahas tentang cara mengubah 999 menjadi sembilan ratus sembilan puluh sembilan (alih-alih hanya sembilan sembilan sembilan). Perlu metode yang lumayan lebih kompleks daripada yang dibahas kali ini.
Selain itu, bila untuk pengumuman dalam bentuk suara, yang digabungkan adalah audio rekaman. Isi tabelnya berubah menjadi daftar audio rekaman untuk tiap karakter. Yang dibahas kali ini menggunakan teks sebagai contoh.
Sekian dahulu tulisanku kali ini. Semoga bermanfaat!