Parse string rupiah ke integer di Python
Konversi 'Rp 1.500.000,00' atau 'Rp1.5jt' menjadi integer 1500000. Handle pemisah ribuan titik, koma desimal, dan singkatan jt/rb.
Dipublikasikan 28 Mei 2026
Data harga produk dari berbagai sumber — Tokopedia, Shopee, marketplace lokal — sering datang dalam format string yang tidak konsisten: "Rp 1.500.000", "Rp1,5jt", "1.5 juta", "Rp 750rb". Snippet ini membersihkan dan mengembalikan integer.
Kode
import re
def parse_rupiah(s: str) -> int:
"""Parse Indonesian rupiah string ke integer (dalam rupiah).
Handle: 'Rp 1.500.000', 'Rp1.5jt', '750rb', '1,5 juta'.
Return: integer dalam rupiah.
Raise: ValueError jika tidak bisa di-parse.
"""
if not s:
raise ValueError("Empty string")
s = s.lower().strip()
s = re.sub(r"^rp\.?\s*", "", s) # buang prefix "Rp" / "Rp."
s = re.sub(r"\s+", "", s) # buang spasi
# Cek suffix singkatan
multiplier = 1
if s.endswith("jt") or s.endswith("juta"):
multiplier = 1_000_000
s = re.sub(r"(jt|juta)$", "", s)
elif s.endswith("rb") or s.endswith("ribu") or s.endswith("k"):
multiplier = 1_000
s = re.sub(r"(rb|ribu|k)$", "", s)
elif s.endswith("m") or s.endswith("milyar") or s.endswith("miliar"):
multiplier = 1_000_000_000
s = re.sub(r"(m|milyar|miliar)$", "", s)
# Format Indonesia: titik = ribuan, koma = desimal
# Konversi ke format Python: hilangkan titik, ganti koma jadi titik
if "," in s:
# Ada koma — anggap sebagai desimal
s = s.replace(".", "").replace(",", ".")
else:
# Tidak ada koma — titik = pemisah ribuan
s = s.replace(".", "")
try:
value = float(s) * multiplier
return int(value)
except ValueError:
raise ValueError(f"Tidak bisa parse: {s!r}")
Kapan dipakai
Saat scraping harga dari marketplace, ETL pipeline yang baca data spreadsheet manual, atau saat normalisasi input dari user di form admin.
Contoh pemakaian
parse_rupiah("Rp 1.500.000") # 1500000
parse_rupiah("Rp1.5jt") # 1500000
parse_rupiah("750rb") # 750000
parse_rupiah("1,5 juta") # 1500000
parse_rupiah("Rp 12.345,67") # 12345 (desimal dipotong oleh int())
parse_rupiah("2.5 milyar") # 2500000000
Catatan
- Fungsi ini lossy untuk format dengan desimal — karena rupiah tidak pakai sen, hasil akhirnya integer dan desimal dibuang oleh
int(). Kalau butuh presisi sen, ubah return type keDecimal. - Tidak validasi kalau string-nya ambigu seperti
"1,000"(di Indonesia =1, di US =1000). Asumsi: input adalah format Indonesia. - Untuk parsing dari OCR atau text yang sangat berantakan, tambahkan validasi range setelah parse — misal: kalau hasil > 100 milyar, kemungkinan parsing salah.
Jangan dipakai untuk transaksi finansial sebenarnya — itu butuh decimal arithmetic dan handling banking-grade. Snippet ini hanya untuk display, analisis, dan ETL.
# tags
rupiahindonesiaformat-uangregex