Cómo formatear un número de teléfono con jQuery

93

Actualmente estoy mostrando números de teléfono como 2124771000. Sin embargo, necesito el número a ser formateado en una forma más legible, por ejemplo: 212-477-1000. Aquí está mi corriente HTML:

<p class="phone">2124771000</p>
Xtian
fuente
1
Respuesta demasiado tarde, pero solo para ayudar a aquellos que aterrizan en esta URL de página: igorescobar.github.io/jQuery-Mask-Plugin
Senthil
5
No estoy seguro de entender el estado cerrado de este. Not Constructive no parece correcto ... Encuentro esta información extremadamente útil y una asociación directa con el problema que me trajo aquí. No impugno el hecho de que está cerrado, sino la razón mostrada para estar cerrado
Brett Weber
Quizás la pregunta fue editada y era menos descriptiva antes ... me parece una pregunta y respuesta SO perfectamente válida, y muchos votos a favor.
Kevin Nelson
1
Biblioteca de Google github.com/googlei18n/libphonenumber no se requiere jQuery.
nu Everest

Respuestas:

217

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

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

O: 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: El método .text () no se puede utilizar en elementos de entrada. Para ingresar texto de campo, use el método .val ().

andlrc
fuente
4
Modifiqué esto para admitir eventos de 'cambio' dentro de los campos de entrada. jsfiddle.net/gUsUK
Zach Shallbetter
3
Un poco más robusto de una expresión regular (aunque requiere una función de reemplazo personalizada) sería /(\d{3})?(\d{3})(\d{4})$/en caso de que no haya un código de área
RevanProdigalKnight
¿Es válido para números de teléfono de todo el mundo?
RamPrasadBismil
Si tiene varios números de teléfono en la página, considere usar la función $ (selector) .each () para aplicar fácilmente esta máscara a todos los números.
Daniel Siebert
Quiero implementarlo con pulsación de tecla y evento de desenfoque. No está formateando el número de teléfono cuando los dígitos son inferiores a 10. El código de muestra es: $('#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
fuente
7
@AndreasAL: Porque un motor de expresiones regulares tiene una sobrecarga pesada, especialmente para algo donde se conoce el formato de entrada y las operaciones de cadena simples son MUCHO más eficientes. Y, por supuesto, existe la regla de que usar una expresión regular para un problema solo te hace tener dos problemas.
Marc B
4
Esta solución también formatea correctamente los números de teléfono con letras, como "212555IDEA".
Jason Whitehorn
1
esto funciona bien en el entorno de Windows pero no en el dispositivo iOS. ¿Hay alguna alternativa que funcione en ambas plataformas
Purushotam Sharma
12

No olvide asegurarse de trabajar con números enteros.

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
fuente
8

Aquí hay una combinación de algunas de estas respuestas. Esto se puede utilizar para campos de entrada. Se trata de números de teléfono de 7 y 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)
  });
}

Ejemplo en vivo: JSFiddle

Sé que esto no responde directamente a la pregunta, pero cuando estaba buscando respuestas, esta fue una de las primeras páginas que encontré. Entonces, esta respuesta es para cualquiera que busque algo similar a lo que yo estaba buscando.

Cruz Núñez
fuente
5

Utilice una biblioteca para manejar el número de teléfono. Libphonenumber de Google es su mejor opción .

// 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

Recomiendo usar este paquete de seegno.

aloisdg se muda a codidact.com
fuente
4

Le proporcioné el enlace jsfiddle para que formatee los números de teléfono de EE. UU. 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('');
  }
});

Ejemplo en vivo: JSFiddle

Kapilrc
fuente
¿Cómo puedo cambiar este patrón para mostrar el número de izquierda a derecha como ==> (021) 88888888
Mostafa
3

prueba algo como esto ...

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
fuente
2

Considere libphonenumber-js ( https://github.com/halt-hammerzeit/libphonenumber-js ) que es una versión más pequeña del famoso y completo libphonenumber.

Ejemplo rápido y sucio:

$(".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);
}
});

(Si usa una expresión regular para evitar la descarga de una biblioteca, evite reformatear en retroceso / eliminar para que sea más fácil corregir errores tipográficos).

Adam Lane
fuente
2

Una solución alternativa:

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

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

Penny Liu
fuente
1

Encontré esta pregunta mientras buscaba en Google una forma de formatear automáticamente números de teléfono a través de un complemento de jQuery. La respuesta aceptada no fue ideal para mis necesidades y han pasado muchas cosas en los 6 años desde que se publicó originalmente. Finalmente encontré la solución y la estoy documentando aquí para la posteridad.

Problema

Me gustaría que el campo de entrada html de mi número de teléfono formatee automáticamente (enmascare) el valor a medida que el usuario escribe.

Solución

Consulte Cleave.js . Es una manera muy poderosa / flexible y fácil de resolver este problema y muchos otros problemas de enmascaramiento de datos.

Dar formato a un número de teléfono es tan fácil como:

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

Entrada:

4546644645

Código:

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

Salida:

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

Salida :-( 123) 657-8963

nirali
fuente
-2

tal vez esto ayude

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('');

obtendrá + 91-123-456-7890

usuario6560624
fuente