Skip to content
nothinxPublic

About

Angka menjadi kata dalam bahasa Indonesia ("seratus dua puluh lima"), plus format angka dan rupiah ("Rp1.250.000").

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

5 Commits

Folders and files

Repository files navigation

Terbilang

English

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

Fitur

  • Aturan bahasa yang benar: sebelas, dua belas, seratus, seribu (bukan "satu ribu"), satu juta, satu juta seribu.
  • Rentang besar: int64_t sampai 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, opsi Rp 1.250.000).
  • Langsung ke Print: Serial, LCD, printer thermal, atau tampilan apa pun yang turunan Print, tanpa buffer.
  • Atau ke buffer char: mengembalikan false jika tidak muat, tanpa menulis lewat batas.
  • Hemat: tanpa String dan 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 yang didukung

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.

Instalasi

Library Manager: Arduino IDE → Sketch → Include Library → Manage Libraries… → cari Terbilang → Install.

Manual: unduh ZIP dari GitHub → Sketch → Include Library → Add .ZIP Library…

Contoh cepat

#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.

Hasil simulasi

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 sederhana: jumlah dan terbilang dari library

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 matplotlib

Kecepatan & memori

Diukur 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).

Ke buffer

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.

Untuk suara (mesin antrean, timbangan bicara)

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.

Referensi fungsi

Terbilang

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.

Opsi

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

Format angka

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.

Contoh yang tersedia

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.

Dibanding library lain

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".

Keterbatasan

  • Di Arduino Uno, double hanya 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), bukan float.
  • 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).

Pengujian

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 && ./uji

Status

Versi 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.

Lisensi

MIT © 2026 Amadeo Wisesa. Lihat LICENSE.

About

Angka menjadi kata dalam bahasa Indonesia ("seratus dua puluh lima"), plus format angka dan rupiah ("Rp1.250.000").

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages