Skip to content

Instantly share code, notes, and snippets.

@luisgabrielm
Last active August 21, 2020 14:01
Show Gist options
  • Save luisgabrielm/323018d0a8c120acce6669ec86acfa96 to your computer and use it in GitHub Desktop.
Save luisgabrielm/323018d0a8c120acce6669ec86acfa96 to your computer and use it in GitHub Desktop.
Validação e formatação de números de telefone e celulares brasileiros
/* Função para checar se string é um número de telefone ou celular brasileiro válido e formatar para melhor uso dentro do código. Última Atualização: 20/08/20
Para utilizar nas suas aplicações basta copiar a função cleanPhoneNumber. Esta função é JS puro e utiliza regex e outros métodos básicos de string para a checagem, sem qualquer dependência ou requisição externa.
Como funciona:
O objetivo desta função é ser capaz de receber como input vários tipos e formatação possíveis, incluindo alguns erros de cadastro como espaço e caracteres extras. Ver exemplos na função test().
- Passe como parametro a string contendo o número a ser validado.
- Caso não seja um número válido a função irá retornar null.
- Caso seja um número valido será retornado um objeto com os seguintes campos:
- basicNumber: número da maneira mais crua possível seguindo o padrão dois digitos do DDD + digitos do telefone - Ex: 21123456789
- linkNumber: link que irá chamar automaticamente o número (tel:)
- readableNumber: número formatado para ser exibido de maneira amigável para usuário - Ex: 21 1234-5678
Premissas:
Para construção desta função fiz algumas buscas online, mas tive dificuldade em achar padrões claros e fáceis de entender em sites oficiais. Além disso esses padrões podem mudar de tempos em tempo então caso haja algum ítem que precise de atualização por favor informar para que eu possa corrigir :)
1. Números 0800 sempre possuem 11 dígitos
2. Números fixos possuem 8 dígitos e nunca começam com 9
3. Números de celular possuem 9 dígitos e sempre começam com 9
Você pode utilizar a função test() neste arquivo para validar o funcionamento com um array de números.
Obs: Essa função não checa se o número é válido ou existe, somente se ele está no padrão correto da ANATEL e poderia existir.
*/
function cleanPhoneNumber(phoneNumber) {
if (!phoneNumber) return null;
//Retira todos os carecteres que não são digitos (espaços, letras, parenteses, traços, ...) e também +55
const basicNumber = phoneNumber.replace(/\+55|\D/g, "");
//Checa se número é 0800
if (basicNumber.substr(0, 4) === '0800' && basicNumber.length === 11)
return {
basicNumber,
linkNumber: basicNumber,
readableNumber: basicNumber.substr(0, 4) + "-" + basicNumber.substr(4, 3) + "-" + basicNumber.substr(-4) //Formatação 0800-123-1234
};
//Checa se número possui DDD válido e possui tamanho correto
if (basicNumber.match(/^([14689][1-9]|2[12478]|3[1234578]|5[1345]|7[134579])/) && (basicNumber.length === 10 || basicNumber.length === 11))
return {
basicNumber,
linkNumber: '+55' + basicNumber,
readableNumber: basicNumber.substr(0, 2) + ' ' + basicNumber.substr(2, basicNumber.length - 6) + '-' + basicNumber.substr(-4),
};
//Caso número não possua DDD verifica se o padrão do número faz sentido
if ((basicNumber.length === 8 && basicNumber[0] != 9) || (basicNumber.length === 9 && basicNumber[0] == 9))
return {
basicNumber,
linkNumber: basicNumber,
readableNumber: basicNumber.substr(0, basicNumber.length - 4) + '-' + basicNumber.substr(-4),
}
//Caso não se encaixe em nenhum padrao retorna nulo
return null;
}
function test() {
const testNumbers = [
"(71) 50518-1284",
"(69) 90251-9767",
"(55) 99812-4762",
"(11) 96384-7498.",
"(11) 4233-8604",
"(11) 97346-8625",
"5521992331596",
"992331596",
"0800-773-0410",
"4233-8511",
"42331324",
"(11) 2397-0320 6237",
"(11)95354-2160",
"95354-2160",
"(19) 9 9365-5852",
"whatsapp",
"Aplicativos de delivery",
"+5511940427775",
"+5511985575678 ",
"+5521942255001",
"(21) 2431-8266",
"0800-722-1123",
" (21) 2408-3322",
"+552199294-9865",
"3003-4408 ",
"(21) 3004-5090 037"
];
testNumbers.forEach(n => {
const formatted = cleanPhoneNumber(n);
console.log(`${n} => ${formatted && formatted.readableNumber}`)
})
}
test();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment