Library Arduino untuk mengubah angka menjadi kata dalam bahasa Indonesia ("seratus dua puluh lima"), plus format angka dan rupiah gaya Indonesia ("Rp1.250.000"). Tanpa String, langsung ke Serial atau LCD.
cetakTerbilang(Serial, 125); // seratus dua puluh lima
Serial.println(formatRupiah(125000)); // Rp125.000- Aturan bahasa yang benar: sebelas, dua belas, seratus, seribu (bukan "satu ribu"), satu juta, satu juta seribu.
- Rentang besar:
int64_tsampai 9,2 kuintiliun, termasuk bilangan negatif ("minus lima"). - Desimal: "tiga koma satu empat", digit di belakang koma dibaca satu per satu.
- Kwitansi: huruf kapital awal ("Seratus …") atau setiap kata ("Seratus Dua Puluh …"), dan akhiran "rupiah".
- Format angka: titik pemisah ribuan dan koma desimal (
1.250.000,1.250,50), rupiah sesuai PUEBI (Rp1.250.000, opsiRp 1.250.000). - Langsung ke Print: Serial, LCD, printer thermal, atau tampilan apa pun yang turunan
Print, tanpa buffer. - Atau ke buffer
char: mengembalikanfalsejika tidak muat, tanpa menulis lewat batas. - Hemat: tanpa
Stringdan tanpa alokasi dinamis, daftar kata di PROGMEM,cetakTerbilang()memakai 0 byte RAM global. - Untuk suara: kata dipisah satu spasi, mudah dipecah lalu diputar sebagai rekaman per kata (DFPlayer, ISD1820).
| Board | Teruji compile |
|---|---|
| Arduino Uno / Nano | ✅ |
| Arduino Mega | ✅ |
| ESP32 DevKit | ✅ |
| ESP32-C3 / S3 | ✅ |
| STM32 Blackpill F411 | ✅ |
| STM32 Bluepill F103 | ✅ |
STM32 memakai core resmi STM32duino (STMicroelectronics). Library ini murni perangkat lunak (hanya butuh Print), jadi seharusnya bekerja di board Arduino lain juga.
Library Manager: Arduino IDE → Sketch → Include Library → Manage Libraries… → cari Terbilang → Install.
Manual: unduh ZIP dari GitHub → Sketch → Include Library → Add .ZIP Library…
#include <Terbilang.h>
void setup() {
Serial.begin(115200);
cetakTerbilang(Serial, 1250000); // satu juta dua ratus lima puluh ribu
Serial.println();
cetakTerbilang(Serial, 1500, KAPITAL_SETIAP_KATA | RUPIAH);
Serial.println(); // Seribu Lima Ratus Rupiah
cetakTerbilangDesimal(Serial, 36.6, 1);
Serial.println(); // tiga puluh enam koma enam
Serial.println(formatAngka(1250000)); // 1.250.000
Serial.println(formatAngka(1250.5, 2)); // 1.250,50
Serial.println(formatRupiah(1250000)); // Rp1.250.000
}
void loop() {}Ganti Serial dengan lcd (LiquidCrystal, LiquidCrystal_I2C, dan sejenisnya) untuk mencetak langsung ke LCD.
Semua tabel di bawah dicetak oleh simulasi di PC yang menjalankan kode library ini (extras/simulasi), bukan diketik manual.
Angka yang sering salah ditulis manual. Kolom terakhir adalah tulisan keliru yang umum, sebagai pembanding (catatan, bukan keluaran library).
| Angka | Keluaran library | Bukan |
|---|---|---|
| 11 | sebelas |
satu belas |
| 100 | seratus |
satu ratus |
| 1.000 | seribu |
satu ribu |
| 1.100 | seribu seratus |
satu ribu seratus |
| 11.000 | sebelas ribu |
satu belas ribu |
| 100.000 | seratus ribu |
satu ratus ribu |
| 101.000 | seratus satu ribu |
seratus seribu |
| 1.000.000 | satu juta |
|
| 1.001.000 | satu juta seribu |
satu juta satu ribu |
| 2.147.483.647 | dua miliar seratus empat puluh tujuh juta empat ratus delapan puluh tiga ribu enam ratus empat puluh tujuh |
|
| -1.500 | minus seribu lima ratus |
|
| 3,14 | tiga koma satu empat |
Format angka dan rupiah
| Pemanggilan | Hasil |
|---|---|
formatAngka(1250000) |
1.250.000 |
formatAngka(-1250000) |
-1.250.000 |
formatAngka(1250.5, 2) |
1.250,50 |
formatRupiah(1250000) |
Rp1.250.000 |
formatRupiah(1250000, true) |
Rp 1.250.000 |
formatRupiah(-5000) |
-Rp5.000 |
Opsi, untuk 1.250.000
| Opsi | Hasil |
|---|---|
| (tanpa opsi) | satu juta dua ratus lima puluh ribu |
KAPITAL_AWAL |
Satu juta dua ratus lima puluh ribu |
KAPITAL_SETIAP_KATA |
Satu Juta Dua Ratus Lima Puluh Ribu |
RUPIAH |
satu juta dua ratus lima puluh ribu rupiah |
KAPITAL_AWAL | RUPIAH |
Satu juta dua ratus lima puluh ribu rupiah |
KAPITAL_SETIAP_KATA | RUPIAH |
Satu Juta Dua Ratus Lima Puluh Ribu Rupiah |
Kwitansi yang dirender dari keluaran library: Rp1.250.000 dan Satu juta dua ratus lima puluh ribu rupiah.
Untuk suara. Dari 1.005.996 bilangan yang diperiksa (semua 0 sampai 999.999, ditambah jutaan, miliaran, triliunan, negatif, desimal, dan RUPIAH), library hanya memakai 24 kata berikut:
0001 nol · 0002 satu · 0003 dua · 0004 tiga · 0005 empat · 0006 lima · 0007 enam · 0008 tujuh · 0009 delapan · 0010 sembilan · 0011 sepuluh · 0012 sebelas · 0013 belas · 0014 puluh · 0015 seratus · 0016 ratus · 0017 seribu · 0018 ribu · 0019 juta · 0020 miliar · 0021 triliun · 0022 minus · 0023 koma · 0024 rupiah
Urutan file untuk satu nomor antrean (satu rekaman per kata):
| Nomor | Kata | File |
|---|---|---|
| 7 | tujuh |
0008.mp3 |
| 11 | sebelas |
0012.mp3 |
| 15 | lima belas |
0006.mp3 0013.mp3 |
| 100 | seratus |
0015.mp3 |
| 123 | seratus dua puluh tiga |
0015.mp3 0003.mp3 0014.mp3 0004.mp3 |
| 1000 | seribu |
0017.mp3 |
Tabel dan gambar dibuat dari simulasi di PC yang menjalankan kode library ini (extras/simulasi):
cd extras/simulasi
python gambar.py # butuh g++ dan matplotlibDiukur dengan simavr (simulator ATmega328P yang akurat per siklus) di Arduino Uno 16 MHz. Keluaran dikirim ke Print yang membuang karakter, jadi yang terukur adalah library, bukan UART. Pembanding: currency 0.2.1 (RobTillaart) dan Serial.print(long) bawaan Arduino (tanpa titik ribuan).
| Pemanggilan | Terbilang 1.0.1 | Terbilang 1.0.0 | currency 0.2.1 |
print(long) |
|---|---|---|---|---|
formatAngka(125) |
1.543 siklus (96 µs) | 3.396 (212 µs) | 2.579 (161 µs) | 2.108 (132 µs) |
formatAngka(1250000) |
1.939 (121 µs) | 10.302 (644 µs) | 6.182 (386 µs) | 4.686 (293 µs) |
formatAngka(2147483647) |
2.564 (160 µs) | 17.858 (1.116 µs) | 8.939 (559 µs) | 6.685 (418 µs) |
formatAngka(INT64_MIN) |
5.317 (332 µs) | 53.182 (3.324 µs) | 55.169 (3.448 µs)¹ | - |
cetakTerbilang(125) |
2.791 (174 µs) | 2.897 (181 µs) | - | - |
cetakTerbilang(1250000) |
3.882 (243 µs) | 6.866 (429 µs) | - | - |
cetakTerbilang(2147483647) |
9.470 (592 µs) | 14.832 (927 µs) | - | - |
cetakTerbilang(INT64_MIN) |
19.023 (1.189 µs) | 33.929 (2.121 µs) | - | - |
¹ currency64(). formatRupiah() sama dengan formatAngka() ditambah ±136 siklus.
Flash tambahan (sketch dengan satu fungsi dikurangi sketch kosong setara) dan RAM global:
| Fungsi | Flash 1.0.1 | Flash 1.0.0 | RAM |
|---|---|---|---|
cetakTerbilang() |
1.432 B | 1.288 B | 0 B |
formatAngka() |
960 B | 722 B | 12 B |
formatRupiah() |
1.002 B | 758 B | 12 B |
| keempat fungsi utama | 2.484 B | 2.326 B | 12 B |
currency() / currency64() 0.2.1 |
476 B / 916 B | ||
Serial.print(long) |
330 B |
Semua fungsi O(d) waktu dan O(1) memori, d = jumlah digit (paling banyak 20). Sejak 1.0.1 digit diambil tanpa pembagian: tiap digit adalah berapa kali pangkat sepuluh (tabel di PROGMEM) bisa dikurangkan, dan pengurangan 64 bit hanya dipakai selama angka masih ≥ 2³². Di AVR satu pembagian 64 bit memakan ribuan siklus, jadi formatAngka() 2–10× lebih cepat dan kini lebih cepat daripada Serial.print(long) yang tidak menulis titik.
Kita kalah di flash: currency() butuh separuhnya. Selisih itu untuk 64 bit, titik ribuan, Rp, dan tabel pangkat sepuluh (+±150–240 B dibanding 1.0.0, ditukar dengan kecepatan di atas).
Mengulang pengukuran: sketch extras/benchmark/TerbilangBenchmark (butuh simavr, atau ganti Siklus.h dengan micros() di board sungguhan).
Untuk teks yang perlu disimpan, dipotong, atau dikirim:
char teks[64];
if (terbilang(teks, sizeof(teks), harga, RUPIAH)) {
kirim(teks);
} else {
// tidak muat: teks berisi "" (kosong), bukan teks terpotong
}Panjang terbilang bisa jauh lebih panjang dari angkanya. Contoh: 65.535 menjadi "enam puluh lima ribu lima ratus tiga puluh lima" (47 huruf). Bilangan 32 bit terpanjang (misalnya -1.999.999.999) butuh 145 byte. Jika ragu, cetak langsung ke Print saja.
Setiap kata dipisah tepat satu spasi, jadi teks bisa dipecah dengan strtok() lalu setiap kata diputar sebagai rekaman. Kata yang perlu direkam hanya 24 (lihat contoh PengumumanAntrean):
nol sampai sembilan, sepuluh, sebelas, belas, puluh, seratus, ratus, seribu, ribu, juta, miliar, triliun, minus, koma, rupiah.
| Fungsi | Keterangan |
|---|---|
size_t cetakTerbilang(Print &keluar, int64_t n, uint8_t opsi = 0) |
Cetak n sebagai kata ke Serial, LCD, dll. Mengembalikan jumlah karakter. |
size_t cetakTerbilangDesimal(Print &keluar, double x, uint8_t digit, uint8_t opsi = 0) |
Bilangan desimal dengan digit angka di belakang koma (dibulatkan). 0 jika digit > 9 atau di luar rentang. |
bool terbilang(char *buffer, size_t ukuran, int64_t n, uint8_t opsi = 0) |
Sama, ke buffer. false dan buffer kosong jika tidak muat. |
bool terbilangDesimal(char *buffer, size_t ukuran, double x, uint8_t digit, uint8_t opsi = 0) |
Versi desimal ke buffer. |
Boleh digabung dengan |, misalnya KAPITAL_AWAL | RUPIAH.
| Opsi | Hasil untuk 125 |
|---|---|
| (tanpa opsi) | seratus dua puluh lima |
KAPITAL_AWAL |
Seratus dua puluh lima |
KAPITAL_SETIAP_KATA |
Seratus Dua Puluh Lima |
RUPIAH |
seratus dua puluh lima rupiah |
| Fungsi | Contoh |
|---|---|
TeksAngka formatAngka(int64_t n) |
1250000 → 1.250.000 |
TeksAngka formatAngka(double x, uint8_t digit) |
(1250.5, 2) → 1.250,50 |
TeksAngka formatRupiah(int64_t n, bool spasi = false) |
1250000 → Rp1.250.000, dengan spasi → Rp 1.250.000, negatif → -Rp5.000 |
TeksAngka adalah teks berukuran tetap (32 byte) yang bisa langsung dicetak (lcd.print(formatRupiah(x))), disalin (strcpy(buf, formatAngka(x))), atau dibaca lewat .teks. Untuk desimal, digit wajib diisi: formatAngka(2.5) tanpa digit dianggap bilangan bulat 2.
File → Examples → Terbilang
| Contoh | Isi |
|---|---|
TerbilangSerial |
Ketik angka di Serial Monitor, keluar terbilangnya. |
Kwitansi |
Daftar belanja, total dalam rupiah, dan terbilang gaya kwitansi. |
FormatRupiah |
Format angka, desimal, dan rupiah. |
PengumumanAntrean |
Memecah terbilang per kata untuk diputar sebagai rekaman suara. |
Dari 10.065 library di indeks Library Manager (diperiksa 3 Oktober 2026), belum ada yang mengubah angka menjadi kata dalam bahasa Indonesia. Untuk format uang, library currency (RobTillaart, v0.2.1) memakai simbol mata uang satu karakter (char symbol), sehingga tidak bisa menulis "Rp".
- Di Arduino Uno,
doublehanya 32 bit (±7 digit bermakna).cetakTerbilangDesimal(Serial, 123456.78, 2)bisa terbaca tidak tepat di digit terakhir. Untuk uang, simpan dalam bilangan bulat (rupiah atau sen), bukanfloat. - Diukur di Arduino Uno:
cetakTerbilang()menambah ±1,4 KB flash dan 0 byte RAM global;formatRupiah()±1,0 KB flash dan 12 byte RAM (rincian di Kecepatan & memori).
Aturan bahasa (0–20, puluhan, ratusan, ribuan, juta sampai kuintiliun, batas tipe, negatif, desimal), opsi, buffer yang terlalu kecil, serta format angka dan rupiah diuji otomatis di PC (extras/test) setiap ada perubahan:
cd extras/test
g++ -std=c++11 -I. -I../../src uji.cpp ../../src/*.cpp -o uji && ./ujiVersi 1.0.1 lolos uji logika otomatis di PC dan compile di 7 board. Library ini murni perangkat lunak, jadi uji logika sudah mencakup perilakunya. Jika menemukan kata yang salah, silakan buka issue di GitHub.
MIT © 2026 Amadeo Wisesa. Lihat LICENSE.