Jak sformatować numer telefonu za pomocą jQuery

95

Obecnie wyświetlam numery telefonów, takie jak 2124771000. Jednak muszę liczbę być sformatowany w większej formie czytelnej dla człowieka, na przykład: 212-477-1000. Oto mój obecny HTML:

<p class="phone">2124771000</p>
Xtian
źródło
1
Za późna odpowiedź, ale tylko dla pomocy tym, którzy trafiają na tę stronę URL: igorescobar.github.io/jQuery-Mask-Plugin
Senthil
5
Nie jestem pewien, czy rozumiem status zamknięty tego. Not Constructive nie wydaje się właściwe ... Uważam, że te informacje są niezwykle przydatne i mają bezpośredni związek z problemem, który mnie tu sprowadził. Nie kwestionuję faktu, że jest zamknięty, ale wyświetlany powód zamknięcia
Brett Weber.
Być może wcześniej pytanie zostało zredagowane i było mniej opisowe ... wydaje mi się, że jest to całkowicie poprawne pytanie i odpowiedź SO do mnie, i wiele głosów za.
Kevin Nelson
1
Biblioteka Google github.com/googlei18n/libphonenumber nie wymaga jQuery.
nu everest

Odpowiedzi:

217

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

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

Lub: 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');
});

Uwaga: metody .text () nie można używać na elementach wejściowych. W przypadku tekstu pola wejściowego użyj metody .val ().

andlrc
źródło
4
Zmodyfikowałem to, aby obsługiwać zdarzenia „zmiany” w polach wejściowych. jsfiddle.net/gUsUK
Zach Shallbetter
3
Nieco bardziej niezawodne wyrażenie regularne (chociaż wymaga niestandardowej funkcji zamiany) byłoby /(\d{3})?(\d{3})(\d{4})$/na wypadek, gdyby nie było numeru kierunkowego
RevanProdigalKnight
Czy dotyczy numerów telefonów na całym świecie?
RamPrasadBismil
Jeśli na stronie znajduje się wiele numerów telefonów, rozważ użycie funkcji $ (selector) .each (), aby łatwo zastosować tę maskę do wszystkich numerów.
Daniel Siebert,
Chcę to zaimplementować za pomocą naciśnięcia klawisza i zdarzenia rozmycia. Nie formatuje numeru telefonu, gdy cyfry są mniejsze niż 10. Przykładowy kod to: $('#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.
źródło
7
@AndreasAL: Ponieważ silnik wyrażeń regularnych ma duży narzut, szczególnie w przypadku czegoś, gdzie format wejściowy jest znany, a proste operacje na łańcuchach są DUŻO bardziej wydajne. Oczywiście obowiązuje zasada, że ​​użycie wyrażenia regularnego do problemu powoduje po prostu dwa problemy.
Marc B,
4
To rozwiązanie również poprawnie formatuje numery telefonów zawierające litery, np. „212555IDEA”.
Jason Whitehorn,
1
działa to dobrze w środowisku Windows, ale nie działa na urządzeniu z systemem iOS. czy jest jakaś alternatywa, która działa na obu platformach
Purushotam Sharma
12

Nie zapomnij upewnić się, że pracujesz wyłącznie z liczbami całkowitymi.

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
źródło
9

Oto kombinacja niektórych z tych odpowiedzi. Można to wykorzystać do pól wejściowych. Dotyczy numerów telefonów składających się z 7 i 10 cyfr.

// 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)
  });
}

Przykład na żywo: JSFiddle

Wiem, że to nie odpowiada bezpośrednio na pytanie, ale kiedy szukałem odpowiedzi, była to jedna z pierwszych stron, które znalazłem. Więc ta odpowiedź jest dla każdego, kto szuka czegoś podobnego do tego, czego szukałem.

Cruz Nunez
źródło
5

Użyj biblioteki do obsługi numeru telefonu. Libphonenumber od Google to najlepszy wybór.

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

Polecam skorzystać z tego pakietu przez seegno.

aloisdg przenosi się na codidact.com
źródło
4

Udostępniłem łącze jsfiddle, aby sformatować numery telefonów w USA jako (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('');
  }
});

Przykład na żywo: JSFiddle

Kapilrc
źródło
Jak mogę zmienić ten wzór, aby wyświetlać liczbę od lewej do prawej, na przykład ==> (021) 88888888
Mostafa
3

spróbuj czegoś takiego ...

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
źródło
2

Rozważ libphonenumber-js ( https://github.com/halt-hammerzeit/libphonenumber-js ), który jest mniejszą wersją pełnego i słynnego libphonenumber.

Szybki i brudny przykład:

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

(Jeśli używasz wyrażenia regularnego, aby uniknąć pobierania biblioteki, unikaj ponownego formatowania za pomocą klawisza Backspace / delete ułatwi poprawianie literówek).

Adam Lane
źródło
2

Alternatywne rozwiązanie:

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

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

Penny Liu
źródło
1

Znalazłem to pytanie, szukając sposobu na automatyczne formatowanie numerów telefonów za pomocą wtyczki jQuery. Przyjęta odpowiedź nie była idealna dla moich potrzeb i wiele wydarzyło się w ciągu 6 lat od jej opublikowania. W końcu znalazłem rozwiązanie i dokumentuję je tutaj dla potomności.

Problem

Chciałbym, aby pole wejściowe html mojego numeru telefonu automatycznie formatowało (maskowało) wartość w miarę wpisywania przez użytkownika.

Rozwiązanie

Sprawdź Cleave.js . Jest to bardzo skuteczny / elastyczny i łatwy sposób rozwiązania tego problemu i wielu innych problemów związanych z maskowaniem danych.

Formatowanie numeru telefonu jest tak proste, jak:

var cleave = new Cleave('.input-element', {
    phone: true,
    phoneRegionCode: 'US'
});
Tod Birdsall
źródło
1

Wejście:

4546644645

Kod:

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

Wynik:

(454)664-4645
Sushant
źródło
1

Szybkie wprowadzenie własnego kodu:

Oto rozwiązanie zmodyfikowane z powyższego rozwiązania Cruz Nunez .

// 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{0,3})(\d{0,3})/, "($1) $2");
    } else if (number.length <= 10) {
    number = number.replace(/(\d{3})(\d{3})(\d{1,4})/, "($1) $2-$3");
    } else {
    // ignore additional digits
    number = number.replace(/(\d{3})(\d{1,3})(\d{1,4})(\d.*)/, "($1) $2-$3");
    }
    $(this).val(number)
  });
};

$(phoneFormatter);

JSFiddle

  • W tym rozwiązaniu formatowanie jest stosowane bez względu na to, ile cyfr wprowadził użytkownik. (W rozwiązaniu Nunes formatowanie jest stosowane tylko wtedy, gdy wprowadzono dokładnie 7 lub 10 cyfr).

  • Wymaga wprowadzenia kodu pocztowego w przypadku 10-cyfrowego numeru telefonu w USA.

  • Oba rozwiązania są jednak problematyczne, ponieważ wprowadzane cyfry zawsze są dodawane na końcu.

  • Zamiast tego polecam solidny kod wtyczki jQuery Mask, wspomniany poniżej:

Polecam wtyczkę jQuery Mask

Polecam użycie wtyczki jQuery Mask (strona zawiera przykłady na żywo) na github .
Te linki zawierają minimalne wyjaśnienia, jak używać:

CDN
Zamiast instalować / hostować kod, możesz również dodać link do CDN skryptu CDN Link do wtyczki jQuery Mask
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.16/jquery.mask.min.js" integrity="sha512-pHVGpX7F/27yZ0ISY+VVjyULApbDlD0/X0rgGbTqCE7WFW5MezNTWG/dnhtbBuICzsd0WQPgpE4REBLv+UqChw==" crossorigin="anonymous"></script>

lub
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.16/jquery.mask.js" integrity="sha512-pHVGpX7F/27yZ0ISY+VVjyULApbDlD0/X0rgGbTqCE7WFW5MezNTWG/dnhtbBuICzsd0WQPgpE4REBLv+UqChw==" crossorigin="anonymous"></script>

Formularz kontaktowy WordPress 7: użyj wtyczki Masks Form Fields

Jeśli korzystasz z wtyczki Formularz kontaktowy 7 w witrynie WordPress, najłatwiejszą opcją kontrolowania pól formularza jest dodanie klasy do pola wejściowego, aby zająć się tym za Ciebie.
Wtyczka Masks Form Fields jest jedną z opcji, która to ułatwia.
Podoba mi się ta opcja, ponieważ wewnętrznie osadza zminimalizowaną wersję kodu z wtyczki jQuery Mask wspomnianej powyżej.

Przykładowe użycie w formularzu kontaktowym 7:

<label> Your Phone Number (required)
    [tel* customer-phone class:phone_us minlength:14 placeholder "(555) 555-5555"]
</label>

Ważna część tutaj jest class:phone_us.
Zauważ, że jeśli używasz minlength/ maxlength, długość musi zawierać oprócz cyfr znaki maski.

SherylHohman
źródło
0
 $(".phoneString").text(function(i, text) {
            text = text.replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3");
            return text;
        });

Wyjście :-( 123) 657-8963

nirali
źródło
0

Poniższy program obsługi zdarzeń powinien wykonać niezbędne czynności:

$('[name=mobilePhone]').on('keyup', function(e){
                    var enteredNumberStr=this.$('[name=mobilePhone]').val(),                    
                      //Filter only numbers from the input
                      cleanedStr = (enteredNumberStr).replace(/\D/g, ''),
                      inputLength=cleanedStr.length,
                      formattedNumber=cleanedStr;                     
                                      
                      if(inputLength>3 && inputLength<7) {
                        formattedNumber= cleanedStr.substr(0,3) + '-' + cleanedStr.substr(3,inputLength-1) ;
                      }else if (inputLength>=7 && inputLength<10) {
                          formattedNumber= cleanedStr.substr(0,3) + '-' + cleanedStr.substr(3,3) + '-' + cleanedStr.substr(6,inputLength-1);                          
                      }else if(inputLength>=10) {
                          formattedNumber= cleanedStr.substr(0,3) + '-' + cleanedStr.substr(3,3) + '-' + cleanedStr.substr(6,inputLength-1);                        
                      }
                      console.log(formattedNumber);
                      this.$('[name=mobilePhone]').val(formattedNumber);
            });
Pratap Singh
źródło
-1

Aby rozszerzyć kod Cruz Nunez i dodać ciągłe formatowanie, a także kilka międzynarodowych formatów numerów telefonów.

    $('#phone').on('input', function() {
      var number = $(this).val().replace(/[^\d]/g, '');
      if (number.length == 3) {
        number = number.replace(/(\d{3})/, "$1-");
      } else if (number.length == 4) {
        number = number.replace(/(\d{3})(\d{1})/, "$1-$2");
      } else if (number.length == 5) {
        number = number.replace(/(\d{3})(\d{2})/, "$1-$2");
      } else if (number.length == 6) {
        number = number.replace(/(\d{3})(\d{3})/, "$1-$2-");
      } else if (number.length == 7) {
        number = number.replace(/(\d{3})(\d{3})(\d{1})/, "$1-$2-$3");
      } else if (number.length == 8) {
        number = number.replace(/(\d{4})(\d{4})/, "$1-$2");
      } else if (number.length == 9) {
        number = number.replace(/(\d{3})(\d{3})(\d{3})/, "$1-$2-$3");
      } else if (number.length == 10) {
        number = number.replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3");
      } else if (number.length == 11) {
        number = number.replace(/(\d{1})(\d{3})(\d{3})(\d{4})/, "$1-$2-$3-$4");
      } else if (number.length == 12) {
        number = number.replace(/(\d{2})(\d{3})(\d{3})(\d{4})/, "$1-$2-$3-$4");
      }
      $(this).val(number);
    });
Valik Rudd
źródło
-2

może to pomoże

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

otrzymasz + 91-123-456-7890

user6560624
źródło