You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:如何用正则格式化印尼手机号,兼容带/不带+的国别码

Solution for Indonesian Phone Number Formatting in OTP Screen

Hey there! I’ve worked with Indonesian phone number formatting before, so let’s get this sorted for your OTP screen. Based on the rules you shared, here’s a practical solution that handles all three cases, plus supports the 9-14 digit length range you mentioned.

First, let’s break down the core pattern from your examples:

  • Numbers starting with +62 → +62XXX-XXXX-XXXX-XX
  • Numbers starting with 62 → 62XXX-XXXX-XXXX-XX
  • Numbers starting with 0 → 0XXX-XXXX-XXXX-XX

The key is to preserve the prefix, then split the remaining digits into a 3-digit segment, followed by 4-digit segments, and finally any leftover digits (usually 2 digits for full-length numbers).

JavaScript Implementation (Perfect for Frontend OTP Pages)

Here’s a robust function that handles all cases and the 9-14 digit range:

function formatIndonesianPhoneNumber(phoneInput) {
  // Step 1: Clean the input — keep only + and digits
  const cleanedInput = phoneInput.replace(/[^+0-9]/g, '');
  
  let prefix = '';
  let remainingDigits = '';
  
  // Step 2: Identify the prefix type
  if (cleanedInput.startsWith('+62')) {
    prefix = '+62';
    remainingDigits = cleanedInput.slice(3);
  } else if (cleanedInput.startsWith('62')) {
    prefix = '62';
    remainingDigits = cleanedInput.slice(2);
  } else if (cleanedInput.startsWith('0')) {
    prefix = '0';
    remainingDigits = cleanedInput.slice(1);
  } else {
    // Fallback: Assume local number (add 0 prefix per Indonesian norms)
    prefix = '0';
    remainingDigits = cleanedInput;
  }
  
  // Step 3: Split remaining digits into segments
  const segments = [];
  
  // First segment: 3 digits (if available)
  if (remainingDigits.length >= 3) {
    segments.push(remainingDigits.slice(0, 3));
    remainingDigits = remainingDigits.slice(3);
  } else if (remainingDigits.length > 0) {
    segments.push(remainingDigits);
    remainingDigits = '';
  }
  
  // Next segments: 4 digits each (until we run out)
  while (remainingDigits.length >= 4) {
    segments.push(remainingDigits.slice(0, 4));
    remainingDigits = remainingDigits.slice(4);
  }
  
  // Add any leftover digits as the final segment
  if (remainingDigits.length > 0) {
    segments.push(remainingDigits);
  }
  
  // Step 4: Combine prefix with first segment, then join all segments
  if (segments.length === 0) return prefix;
  const firstCombinedSegment = prefix + segments.shift();
  return [firstCombinedSegment, ...segments].filter(seg => seg).join('-');
}

// Test your examples
console.log(formatIndonesianPhoneNumber('+628101234567890')); // Output: +62810-1234-5678-90
console.log(formatIndonesianPhoneNumber('628101234567890')); // Output: 62810-1234-5678-90
console.log(formatIndonesianPhoneNumber('08101234567890')); // Output: 0810-1234-5678-90

// Test shorter numbers (9-13 digits)
console.log(formatIndonesianPhoneNumber('081012345')); // Output: 081-0123-45
console.log(formatIndonesianPhoneNumber('+62810123456')); // Output: +6281-0123-456

How It Works

  1. Input Cleaning: Removes any non-numeric characters except + to handle messy user input (like spaces or dashes they might type).
  2. Prefix Detection: Correctly identifies the three common Indonesian number prefixes, with a fallback for raw digit inputs.
  3. Smart Segmentation: Splits digits into logical chunks first taking 3 digits, then 4-digit chunks, and finally any remaining digits — this works seamlessly for the full 9-14 digit range.
  4. Clean Output: Joins segments with - and ensures no empty segments are included.

Integration Tip

For your OTP page, call this function in the input’s onChange event to format the number in real-time as the user types. For example, in React:

<input
  type="tel"
  onChange={(e) => {
    e.target.value = formatIndonesianPhoneNumber(e.target.value);
  }}
  placeholder="Enter your phone number"
/>

内容的提问来源于stack exchange,提问作者Alvin Widjaja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:21:50