Como formatar um número de telefone com jQuery

93

No momento, estou exibindo números de telefone como 2124771000. No entanto, eu preciso do número a ser formatado em uma forma mais legível, por exemplo: 212-477-1000. Aqui está o meu atual HTML:

<p class="phone">2124771000</p>
Xtian
fonte
1
Resposta tarde demais, mas apenas para ajudar aqueles que pousam nesta página URL: igorescobar.github.io/jQuery-Mask-Plugin
Senthil
5
Não tenho certeza se entendi o status fechado neste. Não construtivo não parece certo ... Considero esta informação extremamente útil e uma associação direta ao problema que me trouxe até aqui. Não contesto o fato de estar fechado, mas o motivo exibido para o fechamento
Brett Weber
Talvez a pergunta tenha sido editada e fosse menos descritiva antes ... parece uma pergunta e resposta perfeitamente válida para mim, e muitos votos positivos.
Kevin Nelson
1
Biblioteca Googles github.com/googlei18n/libphonenumber sem necessidade de jQuery.
nu everest

Respostas:

217

Simples: http://jsfiddle.net/Xxk3F/3/

$('.phone').text(function(i, text) {
    return text.replace(/(\d{3})(\d{3})(\d{4})/, '$1-$2-$3');
});

Ou: http://jsfiddle.net/Xxk3F/1/

$('.phone').text(function(i, text) {
    return text.replace(/(\d\d\d)(\d\d\d)(\d\d\d\d)/, '$1-$2-$3');
});

Nota: O método .text () não pode ser usado em elementos de entrada. Para texto do campo de entrada, use o método .val ().

andlrc
fonte
4
Eu modifiquei isso para oferecer suporte a eventos de 'mudança' nos campos de entrada. jsfiddle.net/gUsUK
Zach Shallbetter
3
Um pouco mais robusto de uma regex (embora requeira uma função de substituição personalizada) seria /(\d{3})?(\d{3})(\d{4})$/no caso de não haver código de área
RevanProdigalKnight
É válido para números de telefone em todo o mundo?
RamPrasadBismil
Se você tiver vários números de telefone na página, considere usar a função $ (selector) .each () para aplicar facilmente essa máscara a todos os números.
Daniel Siebert
Quero implementá-lo com keypress e evento blur. Não está formatando o número de telefone quando os dígitos são menores que 10. O código de exemplo é: $('#x_phone').on('keypress blur',function() { var ph = $(this).val(); var temp = ph.replace(/(\d{3})(\d{3})(\d{4})/, '$1-$2-$3'); $(this).val(temp); //alert(temp); });
Musaddiq Khan
54
var phone = '2124771000',
    formatted = phone.substr(0, 3) + '-' + phone.substr(3, 3) + '-' + phone.substr(6,4)
Marc B
fonte
7
@AndreasAL: Porque um mecanismo de regex tem uma sobrecarga pesada, especialmente para algo onde o formato de entrada é conhecido e as operações de string simples são muito mais eficientes. E, claro, existe a regra de que usar uma regex para um problema só faz com que você tenha dois problemas.
Marc B
4
Essa solução também formata corretamente os números de telefone com letras, como "212555IDEA".
Jason Whitehorn
1
Isso está funcionando bem no ambiente do Windows, mas não está funcionando no dispositivo iOS. existe alguma alternativa que funcione em ambas as plataformas
Purushotam Sharma
12

Não se esqueça de verificar se você está trabalhando com números puramente inteiros.

var separator = '-';
$( ".phone" ).text( function( i, DATA ) {
    DATA
        .replace( /[^\d]/g, '' )
        .replace( /(\d{3})(\d{3})(\d{4})/, '$1' + separator + '$2' + separator + '$3' );
    return DATA;
});
Trenton Bost
fonte
8

Aqui está uma combinação de algumas dessas respostas. Isso pode ser usado para campos de entrada. Lida com números de telefone com 7 e 10 dígitos.

// Used to format phone number
function phoneFormatter() {
  $('.phone').on('input', function() {
    var number = $(this).val().replace(/[^\d]/g, '')
    if (number.length == 7) {
      number = number.replace(/(\d{3})(\d{4})/, "$1-$2");
    } else if (number.length == 10) {
      number = number.replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3");
    }
    $(this).val(number)
  });
}

Exemplo ao vivo: JSFiddle

Sei que isso não responde diretamente à pergunta, mas quando estava procurando as respostas, esta foi uma das primeiras páginas que encontrei. Portanto, esta resposta é para qualquer pessoa que esteja procurando por algo semelhante ao que eu estava procurando.

Cruz Nunez
fonte
5

Use uma biblioteca para controlar o número de telefone. Libphonenumber do Google é sua melhor aposta.

// Require `PhoneNumberFormat`.
var PNF = require('google-libphonenumber').PhoneNumberFormat;

// Get an instance of `PhoneNumberUtil`.
var phoneUtil = require('google-libphonenumber').PhoneNumberUtil.getInstance();

// Parse number with country code.
var phoneNumber = phoneUtil.parse('202-456-1414', 'US');

// Print number in the international format.
console.log(phoneUtil.format(phoneNumber, PNF.INTERNATIONAL));
// => +1 202-456-1414

Eu recomendo usar este pacote por seegno.

aloisdg mudando para codidact.com
fonte
4

Forneci o link jsfiddle para você formatar os números de telefone dos EUA como (XXX) XXX-XXX

 $('.class-name').on('keypress', function(e) {
  var key = e.charCode || e.keyCode || 0;
  var phone = $(this);
  if (phone.val().length === 0) {
    phone.val(phone.val() + '(');
  }
  // Auto-format- do not expose the mask as the user begins to type
  if (key !== 8 && key !== 9) {
    if (phone.val().length === 4) {
      phone.val(phone.val() + ')');
    }
    if (phone.val().length === 5) {
      phone.val(phone.val() + ' ');
    }
    if (phone.val().length === 9) {
      phone.val(phone.val() + '-');
    }
    if (phone.val().length >= 14) {
      phone.val(phone.val().slice(0, 13));
    }
  }

  // Allow numeric (and tab, backspace, delete) keys only
  return (key == 8 ||
    key == 9 ||
    key == 46 ||
    (key >= 48 && key <= 57) ||
    (key >= 96 && key <= 105));
})

.on('focus', function() {
  phone = $(this);

  if (phone.val().length === 0) {
    phone.val('(');
  } else {
    var val = phone.val();
    phone.val('').val(val); // Ensure cursor remains at the end
  }
})

.on('blur', function() {
  $phone = $(this);

  if ($phone.val() === '(') {
    $phone.val('');
  }
});

Exemplo ao vivo: JSFiddle

Kapilrc
fonte
Como posso alterar este padrão para mostrar o número da esquerda para a direita, como ==> (021) 88888888
Mostafa
3

tente algo assim ..

jQuery.validator.addMethod("phoneValidate", function(number, element) {
    number = number.replace(/\s+/g, ""); 
    return this.optional(element) || number.length > 9 &&
        number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
}, "Please specify a valid phone number");

$("#myform").validate({
  rules: {
    field: {
      required: true,
      phoneValidate: true
    }
  }
});
Anuj Patel
fonte
2

Considere libphonenumber-js ( https://github.com/halt-hammerzeit/libphonenumber-js ), que é uma versão menor do libphonenumber completo e famoso.

Exemplo rápido e sujo:

$(".phone-format").keyup(function() {
// Don't reformat backspace/delete so correcting mistakes is easier
if (event.keyCode != 46 && event.keyCode != 8) {
    var val_old = $(this).val();
    var newString = new libphonenumber.asYouType('US').input(val_old);
    $(this).focus().val('').val(newString);
}
});

(Se você usar um regex para evitar o download de uma biblioteca, evite reformatar em backspace / delete para facilitar a correção de erros de digitação.)

Adam Lane
fonte
2

Uma solução alternativa:

function numberWithSpaces(value, pattern) {
  var i = 0,
    phone = value.toString();
  return pattern.replace(/#/g, _ => phone[i++]);
}

console.log(numberWithSpaces('2124771000', '###-###-####'));

Penny Liu
fonte
1

Eu encontrei essa pergunta enquanto procurava uma maneira de formatar automaticamente números de telefone por meio de um plugin jQuery. A resposta aceita não foi a ideal para minhas necessidades e muita coisa aconteceu nos 6 anos desde que foi postado originalmente. Acabei encontrando a solução e estou documentando aqui para a posteridade.

Problema

Gostaria que o campo de entrada html do meu número de telefone formatasse automaticamente (mascarasse) o valor conforme o usuário digita.

Solução

Confira Cleave.js . É uma maneira muito poderosa / flexível e fácil de resolver esse problema e muitos outros problemas de mascaramento de dados.

Formatar um número de telefone é tão fácil quanto:

var cleave = new Cleave('.input-element', {
    phone: true,
    phoneRegionCode: 'US'
});
Tod Birdsall
fonte
1

Entrada:

4546644645

Código:

PhoneNumber = Input.replace(/(\d\d\d)(\d\d\d)(\d\d\d\d)/, "($1)$2-$3");

Resultado:

(454)664-4645
Sushant
fonte
0
 $(".phoneString").text(function(i, text) {
            text = text.replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3");
            return text;
        });

Saída :-( 123) 657-8963

nirali
fonte
-2

pode ser isso vai ajudar

var countryCode = +91;
var phone=1234567890;
phone=phone.split('').reverse().join('');//0987654321
var formatPhone=phone.substring(0,4)+'-';//0987-
phone=phone.replace(phone.substring(0,4),'');//654321
while(phone.length>0){
formatPhone=formatPhone+phone.substring(0,3)+'-';
phone=phone.replace(phone.substring(0,3),'');
}
formatPhone=countryCode+formatPhone.split('').reverse().join('');

você receberá + 91-123-456-7890

user6560624
fonte