Complete API reference for international phone number formatting with support for 247 countries using Google's libphonenumber format patterns.
Phone formatting requires country-specific addon files that provide Google's libphonenumber formatting patterns.
/**
* Phone formatting requires external addon files
* Each country requires its specific addon to be loaded
*/
interface PhoneFormattingSetup {
// Required: Include country-specific addon before using
// Format: cleave-phone.{countryCode}.js
// Example: <script src="cleave-phone.us.js"></script>
// Phone formatting options
phone: true; // Enable phone formatting
phoneRegionCode: string; // Two-letter country code
}
// Supported country codes (247 total)
type SupportedCountryCode =
| 'us' | 'uk' | 'au' | 'ca' | 'fr' | 'de' | 'jp' | 'cn' | 'in' | 'br'
| 'mx' | 'it' | 'es' | 'ru' | 'kr' | 'th' | 'sg' | 'my' | 'ph' | 'id'
| 'vn' | 'tw' | 'hk' | 'nz' | 'za' | 'ar' | 'cl' | 'co' | 'pe' | 've'
// ... 217 more country codes
;Usage Examples:
<!-- Include required phone addon -->
<script src="cleave-phone.us.js"></script>
<script src="cleave.js"></script>import Cleave from 'cleave.js';
// US phone formatting
const usPhone = new Cleave('#us-phone', {
phone: true,
phoneRegionCode: 'US'
});
// UK phone formatting (requires cleave-phone.gb.js)
const ukPhone = new Cleave('#uk-phone', {
phone: true,
phoneRegionCode: 'GB'
});
// Input: "1234567890"
// US Output: "(123) 456-7890"
// UK Output: "01234 567890" (format varies by UK number type)Changing phone region codes after initialization.
/**
* Change phone region code dynamically
* @param regionCode - Two-letter country code
*/
setPhoneRegionCode(regionCode: string): void;Usage Examples:
const phoneInput = new Cleave('#phone', {
phone: true,
phoneRegionCode: 'US'
});
// Change to UK formatting (requires cleave-phone.gb.js to be loaded)
phoneInput.setPhoneRegionCode('GB');
// Change to Australian formatting (requires cleave-phone.au.js)
phoneInput.setPhoneRegionCode('AU');Using phone formatting with React components.
Usage Examples:
import React, { useState } from 'react';
import Cleave from 'cleave.js/react';
function PhoneForm() {
const [country, setCountry] = useState('US');
const [phoneNumber, setPhoneNumber] = useState('');
return (
<div>
<select value={country} onChange={(e) => setCountry(e.target.value)}>
<option value="US">United States</option>
<option value="GB">United Kingdom</option>
<option value="AU">Australia</option>
<option value="CA">Canada</option>
<option value="FR">France</option>
</select>
<Cleave
value={phoneNumber}
phone={true}
phoneRegionCode={country}
onChange={(e) => {
setPhoneNumber(e.target.value);
console.log('Raw phone:', e.target.rawValue);
}}
placeholder={`Enter ${country} phone number`}
/>
<p>Formatted: {phoneNumber}</p>
</div>
);
}Using phone formatting with Angular directive.
Usage Examples:
<div ng-controller="PhoneController">
<select ng-model="selectedCountry" ng-options="country.code as country.name for country in countries">
</select>
<input
ng-model="phoneNumber"
cleave="getPhoneOptions()"
placeholder="Phone number">
<p>Raw: {{ phoneNumber }}</p>
</div>angular.module('myApp').controller('PhoneController', function($scope) {
$scope.selectedCountry = 'US';
$scope.phoneNumber = '';
$scope.countries = [
{ code: 'US', name: 'United States' },
{ code: 'GB', name: 'United Kingdom' },
{ code: 'AU', name: 'Australia' },
{ code: 'CA', name: 'Canada' }
];
$scope.getPhoneOptions = function() {
return {
phone: true,
phoneRegionCode: $scope.selectedCountry
};
};
});Complete list of available phone formatting addons with their file names and country codes.
/**
* Phone addon files available (247 total)
* Format: cleave-phone.{countryCode}.js
*/
interface PhoneAddons {
// Major countries and regions
'cleave-phone.us.js': 'US'; // United States
'cleave-phone.gb.js': 'GB'; // United Kingdom
'cleave-phone.au.js': 'AU'; // Australia
'cleave-phone.ca.js': 'CA'; // Canada
'cleave-phone.fr.js': 'FR'; // France
'cleave-phone.de.js': 'DE'; // Germany
'cleave-phone.jp.js': 'JP'; // Japan
'cleave-phone.cn.js': 'CN'; // China
'cleave-phone.in.js': 'IN'; // India
'cleave-phone.br.js': 'BR'; // Brazil
'cleave-phone.mx.js': 'MX'; // Mexico
'cleave-phone.it.js': 'IT'; // Italy
'cleave-phone.es.js': 'ES'; // Spain
'cleave-phone.ru.js': 'RU'; // Russia
'cleave-phone.kr.js': 'KR'; // South Korea
// European countries
'cleave-phone.at.js': 'AT'; // Austria
'cleave-phone.be.js': 'BE'; // Belgium
'cleave-phone.ch.js': 'CH'; // Switzerland
'cleave-phone.dk.js': 'DK'; // Denmark
'cleave-phone.fi.js': 'FI'; // Finland
'cleave-phone.no.js': 'NO'; // Norway
'cleave-phone.se.js': 'SE'; // Sweden
'cleave-phone.nl.js': 'NL'; // Netherlands
'cleave-phone.pl.js': 'PL'; // Poland
'cleave-phone.pt.js': 'PT'; // Portugal
// Asian countries
'cleave-phone.th.js': 'TH'; // Thailand
'cleave-phone.sg.js': 'SG'; // Singapore
'cleave-phone.my.js': 'MY'; // Malaysia
'cleave-phone.ph.js': 'PH'; // Philippines
'cleave-phone.id.js': 'ID'; // Indonesia
'cleave-phone.vn.js': 'VN'; // Vietnam
'cleave-phone.tw.js': 'TW'; // Taiwan
'cleave-phone.hk.js': 'HK'; // Hong Kong
// Middle East and Africa
'cleave-phone.ae.js': 'AE'; // UAE
'cleave-phone.sa.js': 'SA'; // Saudi Arabia
'cleave-phone.za.js': 'ZA'; // South Africa
'cleave-phone.eg.js': 'EG'; // Egypt
'cleave-phone.il.js': 'IL'; // Israel
// Americas
'cleave-phone.ar.js': 'AR'; // Argentina
'cleave-phone.cl.js': 'CL'; // Chile
'cleave-phone.co.js': 'CO'; // Colombia
'cleave-phone.pe.js': 'PE'; // Peru
'cleave-phone.ve.js': 'VE'; // Venezuela
// And 192+ more countries...
}Different countries have different phone number formats and patterns.
Usage Examples:
// United States: (123) 456-7890
const usPhone = new Cleave('#us', {
phone: true,
phoneRegionCode: 'US'
});
// United Kingdom: 020 7946 0958
const ukPhone = new Cleave('#uk', {
phone: true,
phoneRegionCode: 'GB'
});
// Australia: (02) 1234 5678
const auPhone = new Cleave('#au', {
phone: true,
phoneRegionCode: 'AU'
});
// France: 01 23 45 67 89
const frPhone = new Cleave('#fr', {
phone: true,
phoneRegionCode: 'FR'
});
// Germany: 030 12345678
const dePhone = new Cleave('#de', {
phone: true,
phoneRegionCode: 'DE'
});
// Japan: 03-1234-5678
const jpPhone = new Cleave('#jp', {
phone: true,
phoneRegionCode: 'JP'
});
// Brazil: (11) 91234-5678
const brPhone = new Cleave('#br', {
phone: true,
phoneRegionCode: 'BR'
});
// India: 9876 543 210
const inPhone = new Cleave('#in', {
phone: true,
phoneRegionCode: 'IN'
});Combining phone formatting with validation logic.
Usage Examples:
function createValidatedPhoneInput(elementId, countryCode) {
const phone = new Cleave(elementId, {
phone: true,
phoneRegionCode: countryCode,
onValueChanged: function(e) {
const rawValue = e.target.rawValue;
const isValid = validatePhoneNumber(rawValue, countryCode);
// Update UI based on validation
const element = e.target;
element.classList.toggle('valid', isValid);
element.classList.toggle('invalid', !isValid);
console.log(`Phone (${countryCode}):`, {
formatted: e.target.value,
raw: rawValue,
valid: isValid
});
}
});
return phone;
}
function validatePhoneNumber(rawPhone, countryCode) {
const validationRules = {
'US': /^\d{10}$/,
'GB': /^\d{10,11}$/,
'AU': /^\d{9,10}$/,
'FR': /^\d{10}$/,
'DE': /^\d{10,12}$/
};
const rule = validationRules[countryCode];
return rule ? rule.test(rawPhone) : rawPhone.length > 0;
}
// Usage
const validatedPhone = createValidatedPhoneInput('#phone', 'US');Complex phone setups with multiple regions and dynamic switching.
Usage Examples:
class InternationalPhoneInput {
constructor(inputId, selectId) {
this.inputElement = document.querySelector(inputId);
this.selectElement = document.querySelector(selectId);
this.currentCleave = null;
this.countries = [
{ code: 'US', name: 'United States', format: '(###) ###-####' },
{ code: 'GB', name: 'United Kingdom', format: '#### ### ####' },
{ code: 'AU', name: 'Australia', format: '(##) #### ####' },
{ code: 'FR', name: 'France', format: '## ## ## ## ##' },
{ code: 'DE', name: 'Germany', format: '### ########' }
];
this.init();
}
init() {
// Populate country select
this.countries.forEach(country => {
const option = document.createElement('option');
option.value = country.code;
option.textContent = `${country.name} (${country.format})`;
this.selectElement.appendChild(option);
});
// Initialize with first country
this.switchCountry(this.countries[0].code);
// Handle country changes
this.selectElement.addEventListener('change', (e) => {
this.switchCountry(e.target.value);
});
}
switchCountry(countryCode) {
// Clean up existing instance
if (this.currentCleave) {
this.currentCleave.destroy();
}
// Create new instance for selected country
this.currentCleave = new Cleave(this.inputElement, {
phone: true,
phoneRegionCode: countryCode,
onValueChanged: (e) => {
this.onPhoneChange(e, countryCode);
}
});
}
onPhoneChange(event, countryCode) {
const country = this.countries.find(c => c.code === countryCode);
console.log(`${country.name} phone:`, {
formatted: event.target.value,
raw: event.target.rawValue
});
}
getValue() {
return this.currentCleave ? this.currentCleave.getRawValue() : '';
}
getFormattedValue() {
return this.currentCleave ? this.currentCleave.getFormattedValue() : '';
}
}
// Usage
const phoneInput = new InternationalPhoneInput('#phone-input', '#country-select');Handling cases where phone addons are not loaded.
Usage Examples:
function createPhoneInputSafe(elementId, countryCode) {
try {
const phone = new Cleave(elementId, {
phone: true,
phoneRegionCode: countryCode
});
console.log(`Phone input created for ${countryCode}`);
return phone;
} catch (error) {
if (error.message.includes('Please include phone-type-formatter')) {
console.error(`Phone addon not loaded for ${countryCode}`);
console.error(`Please include: cleave-phone.${countryCode.toLowerCase()}.js`);
// Fallback to basic formatting
return new Cleave(elementId, {
numericOnly: true,
blocks: [3, 3, 4],
delimiter: '-'
});
}
throw error;
}
}
// Usage with error handling
const safePhone = createPhoneInputSafe('#phone', 'US');