Мы привыкли записывать телефонный номер, начиная с восьмерки. Поэтому когда где-либо требуется записать или ввести на сайте номер телефона в международном формате, то сразу в голове масса вопросов.

Подробно рассказываем, как набрать номер телефона в международном формате, и откуда вообще взялся этот формат.

Российские номера сотовых телефонов в международном формате состоят из трех элементов:

  • +7 — международный код страны, Российской Федерации;
  • ХХХ — три цифры, обозначающих префикс. Эти три цифры определяют название сотового оператора и регион регистрации номера;
  • ХХХ-ХХ-ХХ — семь уникальных цифр, номер абонента, по которому также можно определить регион.

Итак, чтобы записать номер в международном формате, следует набрать 11 цифр, не считая знака плюсика. Эта комбинация используется для звонков из зарубежных стран в Россию, внутри страны можно звонить, набирая вместо +7 восьмерку. В книге контактов лучше сразу сохранять номера в международном формате, потому что зачастую звонки через восьмерку не проходят.

Номер «Мегафон» в международном формате имеет префиксы 920-929, 936 и 937. Номера МТС в международном формате отличаются префиксом 910-919, 980-989. Номера «Билайн» в международном формате легко узнать по префиксам 903-909, 961-968, 976.

Однако стоит учитывать, что номера в одном коде могут быть разделены регулятором между несколькими операторами. Это связано с тем, что номерной ресурс ограничен, и выделить всем операторам, а их зарегистрировано более ста, коды с необходимым количеством номеров, невозможно.

Строго говоря, любые российские сотовые номера сразу пишутся в международном формате, так как без кода страны и кода оператора позвонить по ним невозможно.

Важно знать, что телефонный код +7 Россия разделяет с Казахстаном и Абхазией. Другие республики после распада Союза перешли на собственные коды. Крым также использует российские коды +7-869 (местная связь в Севастополе), а сотовые номера Крыма в международном формате начинаются с комбинации +7978.

В международном формате можно набрать и любой городской (местный) номер. Если вам нужно позвонить, к примеру, в отель за рубежом, со стационарного телефона следует набрать 8-10-{код страны}-{код города}- номер абонента. А вот с сотового номера нужно набирать вместо 8-10 — плюс и код страны.

Международный формат номеров США, Украины, Белоруссии

Цифра +7 определяет принадлежность номера к российской телефонной сети. Для других стран зарезервированы иные коды. Американский сотовый номер выглядит так:

+1 {код страны} ХХХ {код штата или города} ХХХХ-ХХ-ХХ {номер абонента}.

Каждый штат США имеет свой префикс, а вот привязки номера телефона к оператору в США не существует. В одном штате может быть несколько вариаций префиксов.

Например, в Нью-Йорке используются коды 347, 212 и 646. В то же время, абонент с этим номером может переехать в какой угодно штат, роуминга внутри страны нет, так что по этим цифрам можно определить только, в каком штате номер был впервые зарегистрирован.

Также цифры, идущие после +1 в международном американском номере, позволяют определить, со стационарного или сотового номера вам звонят. К примеру, 212 код стационарной сети Нью-Йорка (но не в 100% случаев).

Как видим, американский номер в международном формате также включает 11 цифр. А вот украинский длиннее: здесь код соединения со страной состоит из трех цифр, +380. Украинские мобильные номера в международном формате выглядят так:

+380 {код страны} ХХ {код оператора} ХХХ-ХХ-ХХ {номер абонента}.

У каждого сотового оператора Украины, соответственно, свои коды:

  • 63 и 93 — коды оператора Lifecell;
  • 50, 66, 95, 99 — Vodafone;
  • 67, 68, 69, 96, 97, 98 — префиксы для звонков в сети Киевстар;
  • 91 — ТриМоб;
  • 92 — PEOPLEnet.

Белорусские сотовые телефоны в международном формате легко определить по начальным цифрам +375.

Хотя у Казахстана код страны совпадает с Россией, их номера определяются по префиксу: они имеют формат +7(6xx)xxx-xx-xx или +7(7xx)xxx-xx-xx. Префиксы российских сотовых операторов принадлежат исключительно диапазону (9хх).

Отметим, что на территории страны также действует нумерация с кодом начинающимся на восьмерку. Также, как в России, это специальные многоканальные номера. К примеру, 800 для бесплатных звонков с любого казахстанского номера.

Теория появления международного формата номера

Последовательность набора номера определяется телефонным планом нумерации — унифицированной системой, позволяющей пользователям сети отправлять и принимать звонки, а также определять звонящего (услуга определения номера включена во все тарифные планы сотовых операторов).

В мире существует два плана нумерации: открытый и закрытый. При первом местные вызовы можно совершать без национального номера (кода города), а при втором, то есть закрытом, необходимо набирать полный международный формат номера для звонка любого вида: местного, междугороднего, международного.

В основном страны применяют закрытый план нумерации, Москва сегодня полностью переведена на него. Отметим, что популярный термин “прямой номер” появился до того, как введен закрытый план. “Кривым”, на самом деле, является не номер с городским кодом, а тот, что можно набирать напрямую без кода города/оператора.

По планам Министерства коммуникаций и связи, к 2020 году Россия должна полностью перейти на закрытый план нумерации. Это означает, что в городах нельзя будет набирать короткие 5-7-значные номера для местных вызовов, а всегда будет необходимо использовать полный международный формат номера.

Сейчас у нас есть различие в наборе комбинаций при звонках внутри телефонной зоны, за ее пределы и при междугородних вызовах.

  • ХХХ-ХХ-ХХ — звонки по местным городским номерам, никакие коды не нужны;
  • (Код города) ХХХ-ХХ-ХХ — междугородные звонки, набираются с кодом города;
  • +7 (код города) (номер абонента) — для звонков из-за пределов РФ.

Если говорить о вызовах со стационарных телефонов, то для выхода на межгород нужно набирать 8-ку (в других странах 0).

При закрытом плане нумерации всегда нужно будет набирать расширенный вариант, то есть с +7 и кодом города.

Страны редко меняют план нумерации, но в ближайшем будущем это предстоит россиянам. Большинство абонентов не почувствуют разницы, ведь в телефонной книге смартфона удобно сразу сохранять длинную версию номера, лишь только редким пользователям стационарных телефонов придется всегда набирать длинные номера в международном формате.

Резюме

Российский номер сотового телефона в международном формате состоит из 11 цифр, где +7 — это международный идентификатор страны, (9хх) — префикс оператора, также показывающий регион регистрации номера, а дальше идет семизначный номер абонента.

Для правильного набора местных номеров в международном формате нужно предварительно выяснить код города.

С развитием в стране смартфонов, различных соединений и возможности позвонить в другое государство по беспроводной связи сформировались и правила набора. Это комбинация цифр, позволяющая записать номер телефона и позвонить гражданину, который пребывает за пределами РФ. Россияне привыкли записывать свою нумерацию через восьмерку, но через нее нельзя сделать дозвон до гражданина, находящегося за границей России.

И когда требуется набор номера в другом государстве, то в голове возникает немало вопросов.

Правила набора международного формата

Порядок набора нумерации сотового абонента, который находится за пределами Российского государства, несколько отличается от стандартного звонка по России. Осуществить звонок по России можно, набрав номер как по внутренней комбинации, так и по международной. Человек сможет дозвониться до абонента и в том, и другом случае. А вот если осуществлять звонок в другое государство, то нужно придерживаться определенных правил. В частности:

  1. Разблокировать мобильный телефон, нажать «+» до появления его на дисплее телефона.
  2. Возможно использовать и альтернативный вариант международного формата. К примеру, сочетание цифровой комбинации 810. Но если использовать символ «+», то по умолчанию сеть соединяется с выбранной страной, вне зависимости, какие цифры принадлежат конкретному государству.
  3. Нужно написать код государства, куда человек желает совершить вызов. К примеру, кодовое значение на Украине – 38, в Великобритании – 44.
  4. Далее нужно уточнить код конкретного города или мобильной организации. Состоит комбинация из трех или шести цифр.
  5. Далее последует номер телефона самого абонента. Как правило, это 7-значное значение. Чем количество цифр меньше по городу, тем больше абонентский номер. Как правило, вся нумерация не превышает 10 цифр.
  6. После набора всей необходимой комбинации можно нажимать клавишу звонка и дожидаться соединения.
  7. Если используется IP-телефония, то дополнительно указывается местный номер сотового оператора.

При использовании такого алгоритма действий можно позвонить в любую другую страну.

При желании позвонить в иное государство или страну лучше воспользоваться таксофоном или домашним телефоном. Если же звонок совершать через мобильного оператора, даже при самом дешевом тарифе, нужно будет оплатить и международный звонок по тарифу, и карту использования (если таковая присутствует для звонков за границу). Дополнительно списываются денежные средства еще и за местное соединение, которое указано на карточке.

Чтобы позвонить из России, необходимо сделать выход на связь другого государства при помощи номеров соединения фиксированного вида. К примеру, 8-10- (код государства) (далее комбинация района) (персональная нумерация абонента).

Международный формат номера телефона Е164

Код Е164 часто встречается при наборе формата для звонков в иные государства. Это рекомендация МСЭ-Т, что позволяет уточнить план нумерации каждой страны для голосового соединения. Стандарт распространяется для эры ISDN. Особенности цифрового значения:

  • числовое значение ограничено максимальным количеством цифрового ряда – 15 чисел, исключение – код Dial out;
  • первоначально прописывается код страны, который состоит из 1-3 цифр;
  • затем идет национальный код регионального принципа, а в конце абонентский номер.

Часто используется стандарт не только Е164, но и Е123. Последней версией стандарта считается третья.

Код страны

Это компонент, который входит в цифровое значение при наборе международного формата. Когда гражданину нужно совершить исходящую связь другому абоненту, находящемуся за пределами российского пространства, потребуется ввести комбинацию цифр, соответствующую стране. В документации представлено сразу 9 зон, в которых присутствуют собственные цифровые значения. В частности:

  • к первой зоне относят Северную Америку;
  • ко второй зоне относят Африку и близлежащие острова;
  • к третьей и четвертой страны Европы – Испания, Франция, Исландия;
  • к пятой и шестой зоне Центральная, Южная Америка и Юго-Восточная Азия соответственно;
  • к седьмой зоне относят страны, которые ранее были в Советском Союзе;
  • к восьмой зоне относят Восточную Азию и специализированные службы, которые используют спутниковую систему для проведения голосовых соединений;
  • к девятой зоне относят жителей Азии.

В международном формате представлено немало комбинации цифр. При необходимости совершить звонок за пределы Российской Федерации можно воспользоваться справочником.

Код набора номера

Если с обычными телефонами все ясно, то с Айфоном возникают сложности. Для начала владельцу «яблока» необходимо набрать код выхода при размещении голосового вызова в иное государство. Такая комбинация известна как префикс международного формата, а иногда IDD. Фактически это прямое соединение со страной.

В качестве стандарта МСЭ рекомендует набирать два нуля. Этот стандарт внедрен многими странами, но далеко не всеми. К примеру, чтобы сделать соединению гражданину с Айфона в Канаду или Соединенные Штаты Америки, необходимо написать 011 для входа в систему. Такая система позволяет осуществить голосовую связь, даже если оба абонента находятся в разных государствах с разными номерами городов и префиксами.

То есть в Великобритании нужно при звонке набрать 00617, а в Соединенных Штатах Америки уже 011617.

Код соединительной линии

Иногда происходят сбои при голосовом звонке по номеру телефона по причине кода внешней линии.

Код соединительной линии – это последовательность цифр, которую необходимо набрать до международного номера для инициирования телефонного вызова с целью уточнения телекоммуникационного формата. Для этого и необходим знак «+» — чтобы сначала набирается международный код внешней линии, а затем уже идет комбинация государства.

Представленное понятие может быть как единой цифрой, так и цифровым кодом, который используется для размещения всех голосовых соединений в конкретном государстве. По факту сейчас не во всех странах используется данный формат. На практике номер записывается путем применения национальной цифровой комбинации, указанной в скобках.

То есть, например, если звонить в ту же Австралию, то формат звонка будет выглядеть следующим образом +61(0)7 и далее номер абонента.

Международный формат номеров мобильных телефонов в России

Российская нумерация в формате международного типа состоит сразу же из 3 составляющих. В частности:

  • +7 – кодовое значение представленного государства в международном значении;
  • ХХХ – это префикс, обозначающий наименование мобильной организации и регион для регистрации соединения;
  • Остальные цифры – нумерация владельца симки, с которым необходимо созвониться. Под данным цифровым значением возможно уточнить региональное местоположение человека.

То есть для набора по России достаточно набрать 11 цифр номера абонента, и это не считая +. Аналогичные показатели нужно ввести, если человек желает совершить с другого государства звонок в РФ. Внутри России можно или через восьмерку совершать звонки или же через +7. В контактной книге лучше сохранять номер сразу же в международном формате, так как некоторые звонки через 8 не проходят по сотовой вышке.

Сотовый оператор Мегафон в международном масштабе имеет комбинацию цифр 920, 929, 936 и 937. Если говорить о сотовом операторе МТС, то префикс 910, 919, 989 и 980. В Билайне прослеживается комбинация 903, 961, 909, 968, 976.

Стоит понимать, что сейчас по новой программе перехода номера человек может перейти на другого сотового оператора, сохранив свой номер телефона. Соответственно, узнать, кому принадлежит префикс, становится невозможным.

Формат + 7 Российская Федерация делит с Казахстаном и Абхазией. Другие же страны нашли другие префиксы и используют их. К примеру, в Республике Крым используется +7-869 (это для Севастополя), остальные же жители Крыма используют +7978.

Для звонков на номера любого сотового оператора, зарегистрированного в Российской Федерации, вне зависимости от расположения в домашнем регионе, нужно набрать формат 8 (код города) и восьмизначное значение или же +7 (код города) – это федеральное значение. Если нужно указать и добавочный номер, то нужно набрать изначально основной по вышеуказанной инструкции, дождаться ответа автоинформатора, а затем набрать дополнительный. Если телефон не поддерживает тональный режим, то сразу же после небольшой паузы введенного основного номера, прописывается символ Р, а далее уже дополнительную комбинацию.

Previous Entry | Next Entry

Правильное написание телефонных номеров. Взято с ebanners.ru

Как правильно писать номер телефона — формат телефонных номеров — номер телефона в международном формате

В каких странах и как именно принято писать телефонные номера

Особенности написания телефонных номеров — как принято писать телефонные номера, как правильно писать номера телефонов по международным стандартам.

Практически интернациональный формат телефонного номера не существует.

Формат номера телефона в USA — Как пишется номер телефона в Америке (США)

Все без исключения современные мобильные телефоны содержат полный латинский алфавит (а некоторые модели — русский). Тут возникает проблема с двумя способами использования букв. Первая модель — американская. Если вы едете по дороге и видите на большом грузовике надпись How am I driving? Call 1-800-EAT-SHIT, это значит, что вам предлагают позвонить по телефону 1-800-328-7448.

То есть американский формат записи XXX-XXXX

В Европе телефонные номера всегда отделялись блоками по две цифры.

Во Франции и в Великом Герцогстве Люксембург используют в качестве разделителя точки или пробелы (восьмизначные номера с кодом города):

XX.XX.XX.XX.XX

XX XX XX XX XX

0 800 XX XX XX

В Германии используют пробелы (реже — дефисы):

XXX XX XX

XXX-XX-XX

00 49 (XX XX) XX XX XX

(0 XX XX) X XX

В Болгарии принято писать телефонные номера тремя группами по две цифры:

XX-XX-XX

Особняком стоят Италия и Голландия, где очень часто можно встретить номера телефонов без каких-либо разделителей: XX XXXXXXX, 020-XXXXXXX — вопиющее надругательство над человеком, пытающимся такой номер не то что запомнить, а всего лишь прочитать. Особенно не хватает разделительного знака в записной книжке мобильного телефона — сходу разобрать десять слипшихся цифр нельзя.

В Великобритании (у которой в плане технических стандартов очень много общего с США) пишут номера телефонов двумя группами цифр:

020 XXXX XXXX

+44 20 XXXX XXXX

0XXXX XXXXXX (кроме Лондона)

0800 XXXXXX (бесплатные номера)

Тут уместно напомнить, что в английском языке не принято большие числительные читать одним словом. Даже год при произношении разбивается на два отдельных числа: 1998 по-английски читается как «девятнадцать девяносто восемь», а не «одна тысяча девятьсот девяносто восемь». Иногда числа произносят по одной цифре.

В России (и в СССР) все телефонные номера записывались согласно правилу: дефисом или пробелом отделяются пары цифр справа налево. Если в начале остались три цифры, разрешается записать их слитно.

Пункт 3 правил, опубликованных в «Списке абонентов Московской телефонной сети» за 1916 год, гласит:

«Нумера свыше сотни произносятся так: напр. 1.23 — один двадцать три, 9.72 — девять семьдесят два, 70.09 — семьдесят нуль девять. Нумера свыше 10.000 — произносятся отдельно каждая цифра сотни, например 1.20.48 — один двадцать сорок восемь, 2.08.35 — два нуль восемь тридцать пять, 3.35.29 — три тридцать пять двадцать девять, 4.49.52 — четыре сорок девять пятьдесят два, 5.15.86 — пять пятнадцать восемьдесят шесть и т. д., а не сто двадцать сорок восемь, двести восемь тридцать пять и т. д.»

Эти правила написания номера телефона хорошо знают и военные связисты — при произношении двузначных чисел вероятность ошибки принимающей (слушающей) стороны снижается.

Формат записи телефонного номера для России, стран СНГ и Балтии такой: XXX-XX-XX. Многие бывшие советские республики переняли американский формат записи (XXX-XXXX), совершенно не учитывая культурных, исторических и семантических значений такого формата.

В телефонных справочниках дефисы могут заменяться на пробелы (для экономии времени наборщиков):

Кроме отдельных случаев с удачным сочетанием цифр (типа 222-3-222) сегодня в России телефон должен писаться так:

123-45-67

12-34-56

1-23-45

12-34

(правильное написание телефонного номера для обычных городских номеров)

(123) 123-45-67

(1234) 12-34-56

(12345) 1-23-45

(123456) 12-34

(Как правильно писать телефонный номер для номеров с кодом города)

Например, как писать номер телефона в Москве: (095) 123-45-67

Федеральный формат номера сотового телефона:

8 123 123-45-67

(стандарт написания телефонного номера для номеров мобильных телефонов)

А вот телефонный номер России в международном формате:

+7 123 123-45-67

+7 1234 12-34-56

+7 12345 1-23-45

+7 123456 12-34

(номер телефона в международном формате — правильное написание телефонного номера для обозначения российских номеров телефонов за рубежом)

приведены цитаты из http://www.artlebedev.ru/kovodstvo2/sections/91/

Profile

mr_alinaki

Latest Month

Октябрь 2008
Вс Пн Вт Ср Чт Пт Сб
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

View All Archives

Метки

View my Tags page

Page Summary

  • : (без темы)[+2]

Категории

View my Categories page Разработано LiveJournal.com Designed by Terri McAllister Автор оригинала: David Yonge-Mallo, компания Google

  • Перевод

Список составили разработчики Java, C++ и JavaScript библиотеки libphonenumber для парсинга, форматирования и проверки телефонных номеров Телефонные номера используются повсеместно и довольно давно. Поэтому очень удивительно, сколько заблуждений остаётся у программистов относительно них. 1. Телефонные номера, действительные сейчас, останутся действительными всегда. Телефонные номера определённого типа (например, мобильные), никогда не сменят тип. Подключенный сегодня телефонный номер завтра могут отключить. Бесплатный сегодня номер завтра может стать платным. Оператор связи может расширить диапазон доступных номеров, добавив дополнительную цифру и увеличив длину номера.Подсказка. Не сохраняйте свойства телефонного номера, такие как валидность или тип. Проверяйте эту информацию с помощью библиотеки, когда необходимо. 2. Телефонный номер однозначно идентифицирует человека. Ещё не так давно, когда мобильников не существовало, считалось вполне нормальным иметь один домашний телефон для всей семьи. В некоторых районах мира такое сохранилось до сих пор, когда родственники (или даже друзья) пользуются общим телефонным номером. 3. У человека есть только один телефонный номер. Очевидно, это не всегда так. 4. Телефонные номера не могут быть использованы заново. Старые номера заново вводят в оборот и раздают другим людям. 5. Каждый код страны соответствует в точности одной стране. У США, Канады и нескольких карибских островов одинаковый код +1. Россия и Казахстан делят код +7. И это не единственные примеры! 6. Каждой стране соответствует только один код. В данный момент (март 2016 года) на телефоны в спорной и не всеми признанной территории Косово можно дозвониться через национальные коды Сербии (+381), Словении (+386) или Монако (+377), смотря где и когда был выдан номер.Подсказка. Используйте телефонный виджет, чтобы подтолкнуть пользователей к вводу телефонного номера в международном формате. 7. Телефонный номер можно набрать отовсюду. Некоторые номера можно набрать только внутри страны. Некоторые набираются из определённой группы стран, например, как международные номера 00800. Некоторые набираются только если абонент обслуживается конкретным оператором связи. 8. Есть только два способа набрать номер: в международном формате или в местном. Для некоторых номеров требуются различные префиксы, в зависимости от того, откуда набирается номер; с какого устройства и на какое устройство вы звоните; находитесь ли вы внутри или за пределами определённого географического региона. Примеры:

  • В Бразилии для внутренних звонков в определённых географических границ нужно явно указать код оператора, через которого вы хотите звонить.
  • В Непале предваряющий номер «0» опускается в зависимости от того, звоните вы с мобильного или стационарного телефона.
  • В Новой Зеландии нужно набрать код региона (например, 03), даже если номер в том же регионе, что и вы, за исключением «близкого» номера (обычно границы города/района), для которого код региона набирать нельзя.

Подсказка. Используйте formatForMobileDialling для получения конкретного номера, который пользователь должен набрать со своего мобильного телефона. 9. Чтобы сделать номер доступным для дозвона, достаточно сменить префикс. В Аргентине для внутренних звонков нужно вставить цифры «15» после кода региона, но перед местным номером, а цифру «9» после кода страны (54) нужно удалить. Так международный номер +54 9 2982 123456 превращается в местный номер 02982 15 123456. 10. Ни один префикс реального телефонного номера не может быть реальным телефонным номером. В некоторых странах возможно попасть на другого абонента, если набрать дополнительные цифры после телефонного номера. Так, номер 12345678 может принадлежать одному человеку, а номер 123456 — другому. 11. По неправильно набранному номеру невозможно дозвониться. В некоторых странах или на некоторых аппаратах лишние цифры отбрасываются. Например, 1-800-MICROSOFT — это неправильный номер, но он всё равно соединит с Microsoft, потому что лишние цифры отбрасываются. Также и на номера вроде 911 в некоторых странах можно позвонить, набрав 911123, но не во всех странах. В других странах оператор «исправляет» неправильный номер, например, добавляя мобильный код, если он знает, что это мобильный номер. 12. Все действующие телефонные номера соответствуют спецификациям ITU. Спецификации ITU содержат стандарты вроде такого: «Национальные номера не могут быть больше 16 разрядов», но в Германии раздавали действующие телефонные номера длиннее этого. 13. Все действующие телефонные номера принадлежат какой-либо стране. Есть много «национальных кодов», которые выдавали организациям без географической привязки, таким как «800» или спутниковые сервисы. 14. Телефонный номер содержит только цифры. В Израиле некоторые рекламные номера начинаются с «*». 15. Телефонные номера всегда написаны в ASCII. В Египте телефонные номера обычно записывают местными цифрами.См. такжеЗаблуждения программистов относительно времениЗаблуждения программистов об именах Возникла задача автоматического форматирования телефонных номеров в виде страна (город) номер, и первым делом я обратился к существующим решениям. К сожалению, оказалось, что все найденные решения основываются на обычном подгоне строки под пользовательский формат, имея ограниченную область применения и ошибки при выходе за ее пределы. Для начала приведу обзор найденных решений. Тем, кому это не интересно, рекомендую прокрутить ниже до заголовка «Форматы телефонных номеров» — там уже представлен мой вариант разбора номера с ссылкой на код.

Всеуничтожающий примитив

(Найденное решение. Мое ниже) Первое, на что я наткнулся — были сообщения на форумах и банки скриптов, предлагающие решения следующего плана:

<? function phone_number($sPhone){     $sPhone = ereg_replace(«[^0-9]»,»,$sPhone);     if(strlen($sPhone) != 10) return(False);     $sArea = substr($sPhone, 0,3);     $sPrefix = substr($sPhone,3,3);     $sNumber = substr($sPhone,6,4);     $sPhone = «(«.$sArea.«)».$sPrefix.«-«.$sNumber;     return($sPhone); }

Один из простых вариантов шустрого форматирования телефонных номеров, но каждое такое решение ориентировано на телефонные номера из конкретной локальной зоны и не является решением задачи.

Форматирование с помощью sscanf

(Найденное решение. Мое ниже)

function formatPhone($phone) {     if (empty($phone)) return«»;     if (strlen($phone) == 7)         sscanf($phone, «%3s%4s», $prefix, $exchange);     else if (strlen($phone) == 10)             sscanf($phone, «%3s%3s%4s», $area, $prefix, $exchange);         else if (strlen($phone) > 10)                 if(substr($phone, 0,1)==‘1’) {                     sscanf($phone, «%1s%3s%3s%4s», $country, $area, $prefix, $exchange);                 }                 else{                     sscanf($phone, «%3s%3s%4s%s», $area, $prefix, $exchange, $extension);             }             else                 return«unknown phone format: $phone»;     $out = «»;     $out .= isset($country)? $country.‘ ‘: »;     $out .= isset($area)? ‘(‘. $area. ‘) ‘: »;     $out .= $prefix. ‘-‘. $exchange;     $out .= isset($extension)? ‘ x’. $extension: »;     return$out; }

Не смотря на простое решение, эта функция уже умеет форматировать номера длиной 7, 10 и более цифр, но попадись ей номер из российской глубинки, она подавится и выдаст ошибочный результат.

Symfony, lib/helpers/PhoneHelper.php, format_phone

(Найденное решение. Мое ниже)

function format_phone($phone = », $convert = false, $trim = true) {     // If we have not entered a phone number just return empty     if (empty($phone)) {         return »;     }       // Strip out any extra characters that we do not need only keep letters and numbers     $phone = preg_replace(«/[^0-9A-Za-z]/», «», $phone);       // Do we want to convert phone numbers with letters to their number equivalent?     // Samples are: 1-800-TERMINIX, 1-800-FLOWERS, 1-800-Petmeds     if ($convert == true) {         $replace = array(‘2’=>array(‘a’,‘b’,‘c’),                  ‘3’=>array(‘d’,‘e’,‘f’),                      ‘4’=>array(‘g’,‘h’,‘i’),                  ‘5’=>array(‘j’,‘k’,‘l’),                                  ‘6’=>array(‘m’,‘n’,‘o’),                  ‘7’=>array(‘p’,‘q’,‘r’,‘s’),                  ‘8’=>array(‘t’,‘u’,‘v’), ‘9’=>array(‘w’,‘x’,‘y’,‘z’));           // Replace each letter with a number         // Notice this is case insensitive with the str_ireplace instead of str_replace          foreach($replace as $digit=>$letters) {             $phone = str_ireplace($letters, $digit, $phone);         }     }       // If we have a number longer than 11 digits cut the string down to only 11     // This is also only ran if we want to limit only to 11 characters     if ($trim == true && strlen($phone)>11) {         $phone = substr($phone,  0, 11);     }       // Perform phone number formatting here     if (strlen($phone) == 7) {         return preg_replace(«/([0-9a-zA-Z]{3})([0-9a-zA-Z]{4})/», «$1-$2», $phone);     } elseif (strlen($phone) == 10) {         return preg_replace(«/([0-9a-zA-Z]{3})([0-9a-zA-Z]{3})([0-9a-zA-Z]{4})/», «($1) $2-$3», $phone);     } elseif (strlen($phone) == 11) {         return preg_replace(«/([0-9a-zA-Z]{1})([0-9a-zA-Z]{3})([0-9a-zA-Z]{3})([0-9a-zA-Z]{4})/», «$1($2) $3-$4», $phone);     }       // Return original phone if not 7, 10 or 11 digits long     return $phone; }

Функция позволяет не только форматировать в XXX-XXXX, (XXX) XXX-XXXX и X (XXX) XXX-XXXX, но и конвертировать номера, написанные цифрами. Ограниченность функции в форматировании номеров длиной 7, 10 и 11 символов никак не подходит.

Форматы телефонных номеров

Из вики-статьи видно, что никакого простого и удобного паттерна для быстрого форматирования всех номеров не существует. Коды стран регистрируются, подобно доменным зонам, а коды городов — остаются на совести каждой из стран. Другими словами, маршрутизация звонков идет по маске, начиная с кода страны: звонок, направленный в конкретную страну далее пробивает себе маршрут в соответствии с кодами области, города, района и т.д. начиная с самой левой цифры, пока последнее звено не перебросит его на конкретный телефонный/факсовый аппарат. Проблема усложняется еще и тем, что коды городов внутри стран точно так же не поддаются единой сквозной стандартизации, т.е. в худшем из вариантов для правильного форматирования номеров придется использовать двумерный массив с кодами стран и их городов.На самом деле, все оказалось не так страшно. В каждой стране можно разделить все коды городов на две части: на те, что в большинстве своем совпадают по длине, и все остальные. Этого достаточно, чтобы резко сократить область перебора кодов при сравнении. Т.е. можно создать массив из данных по каждой стране вида:

<? $data = Array( ‘Код страны’=>Array(         ‘name’=>‘Имя страны’, // для удобства. Не будет использоваться.         ‘cityCodeLength’=> обычная_длина_кода_города_для_этой_страны,         ‘exceptions’=>Array(коды_городов_исключения),     ) );

Затем провести предварительную обработку данных, дополнив его полями, сужающими область перебора, exceptions_max и exceptions_min — максимальной и минимальной длиной кода городов-исключений, соответственно. Также необходимо учесть страны, в которых коды городов начинаются на 0 — отразим эту «особенность» полем zeroHack. Как пример:

<? $data = Array( ‘886’=>Array(         ‘name’=>‘Taiwan’,         ‘cityCodeLength’=>1,         ‘zeroHack’=>false,         ‘exceptions’=>Array(89,90,91,92,93,96,60,70,94,95),         ‘exceptions_max’=>2,         ‘exceptions_min’=>2     ), );

После этого возьмем подходящие участки кода из решений выше и сделаем функцию форматирования:

<? function phone($phone = », $convert = true, $trim = true) {     global $phoneCodes; // только для примера! При реализации избавиться от глобальной переменной.     if (empty($phone)) {         return »;     }     // очистка от лишнего мусора с сохранением информации о «плюсе» в начале номера     $phone=trim($phone);     $plus = ($phone[ 0] == ‘+’);     $phone = preg_replace(«/[^0-9A-Za-z]/», «», $phone);     $OriginalPhone = $phone;       // конвертируем буквенный номер в цифровой     if ($convert == true && !is_numeric($phone)) {         $replace = array(‘2’=>array(‘a’,‘b’,‘c’),         ‘3’=>array(‘d’,‘e’,‘f’),         ‘4’=>array(‘g’,‘h’,‘i’),         ‘5’=>array(‘j’,‘k’,‘l’),         ‘6’=>array(‘m’,‘n’,‘o’),         ‘7’=>array(‘p’,‘q’,‘r’,‘s’),         ‘8’=>array(‘t’,‘u’,‘v’),         ‘9’=>array(‘w’,‘x’,‘y’,‘z’));           foreach($replace as $digit=>$letters) {             $phone = str_ireplace($letters, $digit, $phone);         }     }       // заменяем 00 в начале номера на +     if (substr($phone,  0, 2)==«00»)     {         $phone = substr($phone, 2, strlen($phone)-2);         $plus=true;     }       // если телефон длиннее 7 символов, начинаем поиск страны     if (strlen($phone)>7)     foreach ($phoneCodes as $countryCode=>$data)     {         $codeLen = strlen($countryCode);         if (substr($phone,  0, $codeLen)==$countryCode)         {             // как только страна обнаружена, урезаем телефон до уровня кода города             $phone = substr($phone, $codeLen, strlen($phone)-$codeLen);             $zero=false;             // проверяем на наличие нулей в коде города             if ($data[‘zeroHack’] && $phone[ 0]==‘0’)             {                 $zero=true;                 $phone = substr($phone, 1, strlen($phone)-1);             }               $cityCode=NULL;             // сначала сравниваем с городами-исключениями             if ($data[‘exceptions_max’]!= 0)             for ($cityCodeLen=$data[‘exceptions_max’]; $cityCodeLen>=$data[‘exceptions_min’]; $cityCodeLen—)             if (in_array(intval(substr($phone,  0, $cityCodeLen)), $data[‘exceptions’]))             {                 $cityCode = ($zero? «0»: «»).substr($phone,  0, $cityCodeLen);                 $phone = substr($phone, $cityCodeLen, strlen($phone)-$cityCodeLen);                 break;             }             // в случае неудачи с исключениями вырезаем код города в соответствии с длиной по умолчанию             if (is_null($cityCode))             {                 $cityCode = substr($phone,  0, $data[‘cityCodeLength’]);                 $phone = substr($phone, $data[‘cityCodeLength’], strlen($phone)-$data[‘cityCodeLength’]);             }             // возвращаем результат             return ($plus? «+»: «»).$countryCode.‘(‘.$cityCode.‘)’.phoneBlocks($phone);         }     }     // возвращаем результат без кода страны и города     return ($plus? «+»: «»).phoneBlocks($phone); }   // функция превращает любое число в строку формата XX-XX-… или XXX-XX-XX-… в зависимости от четности кол-ва цифр function phoneBlocks($number){     $add=»;     if (strlen($number)%2)     {         $add = $number[ 0];         $add .= (strlen($number)<=5? "-": "");         $number = substr($number, 1, strlen($number)-1);     }     return $add.implode(«-«, str_split($number, 2)); }   // тесты echo phone(«+38 (044) 226-22-04»).«»; echo phone(«0038 (044) 226-22-04»).«»; echo phone(«+79263874814»).«»; echo phone(«4816145»).«»; echo phone(«+44 (0) 870 770 5370»).«»; echo phone(«0044 (0) 870 770 5370»).«»; echo phone(«+436764505509»).«»; echo phone(«(+38-048) 784-15-46 «).«»; echo phone(«(38-057) 706-34-03 «).«»; echo phone(«+38 (044) 244 12 01 «).«»;

, где global $phoneCodes; — тот самый массив с информацией по всем странам.Выведет

+380(44)226-22-04+380(44)226-22-04+7(926)387-48-14481-61-45+44(0870)770-53-70+44(0870)770-53-70+43(6764)50-55-09380(4878)415-46380(5770)634-03+380(44)244-12-01

Функция полностью решает поставленную задачу.Из недостатков функции следует отметить отсутствие анализа медленных участков с целью оптимизаци, а также обработки телефонных номеров, где есть код города, но нет кода страны (в этом случае достаточно бить на блоки функцией phoneBlocks или воспользоваться одним из решений выше). При использовании ее в какой-либо реализации необходимо заменить глобальную переменную на ссылку в параметре, а также можно доработать или заменить формат вывода, за который отвечает функция phoneBlocks.

Самое интересное

Используя информацию с сайтов:http://www.mtt.ru/info/def/index.wbphttp://www.hella.ru/code/codeuro.htmhttp://www.scross.ru/guide/phone-global/ я собрал массив данных по всем представленным странам, включая города-исключения, флаги zeroHack, а также коды мобильных сетей. Код можно загрузить здесь.

Быстродействие

Вопреки всем самым пессимистичным ожиданиям, код отрабатывает 10.000 номеров менее чем за 2 секунды.UPD Готовятся поправки:

  1. поддержка паттернов форматирования, принятых внутри конкретных стран («локально-принятые» нормы отображения номеров);
  2. добавление флага для указания, относительно какой страны выполнять форматирование номера;
  3. добавление параметра для указания формата вывода (в случае личных предпочтений и исключений);
  4. поддержка нелатинских буквенных номеров
  5. определение сотовых номеров и замена скобок на пробелы

UPD: Архив пропал с сервера, выложил на https://github.com/mrXCray/PhoneCodesСкоро будет обновление по поправкам выше + бонус. 219 40,4k 219

ОСТАВЬТЕ ОТВЕТ

Войти с помощью: 
Please enter your name here
Please enter your comment!