← Kembali

JavaScript Pemula Validasi

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_number di 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 onBlur input, bukan di onChange — supaya user tidak terganggu saat masih mengetik.

# tags

teleponindonesiavalidasiregex

← Semua snippet Snippet JavaScript lain →