Normalisasi nomor HP Indonesia (+62 vs 08)
Konversi 0812-xxx, +6281xxx, 6281xxx, 81xxx menjadi format konsisten +6281xxx. Reject yang bukan nomor HP Indonesia.
Dipublikasikan 27 Mei 2026
Database user lama selalu punya nomor HP dengan format campur — 0812-xxx-xxx, +62 812 xxx xxx, 6281xxxx, 81xxxx. Snippet ini normalize ke format E.164 (+6281xxx) sebelum simpan ke database. Validasi: minimum 9 digit setelah prefix, maksimum 13 digit, hanya nomor seluler Indonesia.
Kode
/**
* Normalisasi nomor HP Indonesia ke format E.164 (+62...).
* @param {string} input - Nomor input dalam format apapun.
* @returns {string|null} - Format +62..., atau null kalau tidak valid.
*/
function normalizeHpIndonesia(input) {
if (typeof input !== "string") return null;
// Buang spasi, tanda hubung, kurung, plus
let cleaned = input.replace(/[\s\-\(\)\+]/g, "");
// Hanya angka tersisa?
if (!/^\d+$/.test(cleaned)) return null;
// Konversi ke format 62...
if (cleaned.startsWith("0")) {
cleaned = "62" + cleaned.slice(1);
} else if (cleaned.startsWith("8")) {
// Sudah tanpa prefix — anggap mobile Indonesia
cleaned = "62" + cleaned;
} else if (!cleaned.startsWith("62")) {
return null; // bukan format Indonesia
}
// Validasi: 62 + 8... + minimum 8 digit total angka mobile
// Mobile Indonesia: 6281xxxxxxx (10-13 digit setelah '62')
if (!/^628\d{8,11}$/.test(cleaned)) return null;
return "+" + cleaned;
}
Contoh pemakaian
normalizeHpIndonesia("0812-3456-7890"); // "+6281234567890"
normalizeHpIndonesia("+62 812 3456 7890"); // "+6281234567890"
normalizeHpIndonesia("62812 3456 7890"); // "+6281234567890"
normalizeHpIndonesia("81234567890"); // "+6281234567890"
normalizeHpIndonesia("0812345"); // null (terlalu pendek)
normalizeHpIndonesia("+1 555 123 4567"); // null (bukan Indonesia)
normalizeHpIndonesia("0812-xxxx"); // null (ada huruf)
Kapan dipakai
- Sebelum simpan ke kolom
phone_numberdi database — supaya semua entry konsisten dan unique constraint berfungsi. - Sebelum trigger WhatsApp/SMS via API (Twilio, Verihubs, Qontak) — semuanya butuh E.164 format.
- Saat import data CSV dari user yang isi nomornya dengan style mereka sendiri.
Catatan
- Snippet ini hanya validasi format, bukan validasi nomor benar-benar aktif. Untuk cek nomor aktif, pakai service seperti Twilio Lookup atau Verihubs.
- Tidak handle nomor PSTN (021, 022, 031). Kalau butuh, perluas regex ke
^62(2|3|4|5|6|7|9)\d{6,9}$. - Tidak validasi prefix operator (Telkomsel 0811-0813, Indosat 0814-0816, dst). Kalau butuh, tambahkan check setelah normalize.
Buat React/Vue form, panggil ini di
onBlurinput, bukan dionChange— supaya user tidak terganggu saat masih mengetik.
# tags
teleponindonesiavalidasiregex