v8: Функция разбора/сбора телефонного номера Ключевые слова: функция,телефонный номер
Функция разбирает строку с телефонами, разделенным запятым в массив структур {КодСтраны, КодГорода, Телефон, Добавочный}
Примеры разбираемых конструкций:
+7(911)046-45-45#33, 456-11-11
#33, 8(100)456-11-11
При сборе вставляет тире в правильной позиции:
111-894
123-4567
22-44
Функция ТелефонныйНомерРазобрать(ПрмТелефон) Экспорт
Перем Телефон;
Перем Рез;
Рез=Новый Массив();
КоличествоНомеров=0;
ИсхТелефон=СтрЗаменить(ПрмТелефон,"-","");
ИсхТелефон=СтрЗаменить(ИсхТелефон," ","");
//ЭтоКодСтраны=ложь;
ВНачало=истина;
Длина=СтрДлина(ИсхТелефон)+1;
Для Инд=1 По Длина Цикл
Если ВНачало Тогда
ТекЧисло="";
КодСтраны="";
КодГорода="";
Телефон="";
Добавочный="";
Уровень="Страна";
ТелефонГотов=Ложь;
ВНачало=ложь;
КонецЕсли;
Последний=Инд=Длина;
Если НЕ Последний Тогда
Симв=Сред(ИсхТелефон,Инд,1);
Если Инд=1 и Симв="+" Тогда
//ЭтоКодСтраны=истина;
Продолжить; //Знак кода страны
КонецЕсли;
Если Симв>="0" И Симв<="9" тогда //Имеем число
ТекЧисло=ТекЧисло+Симв;
КонецЕсли;
Если Симв="("тогда //Имеем код страны
Если Уровень="Страна" Тогда
КодСтраны=ТекЧисло;
Уровень="Город";
ИначеЕсли Уровень="Номер" Тогда
Телефон=ТекЧисло;
Уровень="Добавочный";
КонецЕсли;
ТекЧисло="";
КонецЕсли;
Если Симв=")"тогда //Имеем код города
Если Уровень="Город" Тогда
КодГорода=ТекЧисло;
Уровень="Номер";
ИначеЕсли Уровень="Добавочный" Тогда
Добавочный=ТекЧисло;
Уровень="Номер";
КонецЕсли;
ТекЧисло="";
КонецЕсли;
Если Симв="#" тогда //Имеем код города
Телефон=ТекЧисло;
ТекЧисло="";
Уровень="Добавочный";
КонецЕсли;
Если Симв="," Тогда
ТелефонГотов=Истина;
КонецЕсли;
Иначе
ТелефонГотов=истина;
КонецЕсли;
Если ТелефонГотов Тогда
Если ТекЧисло<>"" Тогда
Если Уровень="Добавочный" Тогда
Добавочный=ТекЧисло;
ИначеЕсли Уровень="Город" Тогда
КодГорода=ТекЧисло;
ИначеЕсли Уровень="Страна" Тогда
КодСтраны=ТекЧисло;
Иначе
Телефон=ТекЧисло;
КонецЕсли;
КонецЕсли;
//Анализируем частные случаи
//67895
Если Телефон="" И КодСтраны<>"" И КодГорода="" Тогда
Телефон=КодСтраны;
КодСтраны="";
КонецЕсли;
//67895(13)
Если КодСтраны<>"" И Телефон="" И КодГорода<>"" И Добавочный="" Тогда
Телефон=КодСтраны;
Добавочный=КодГорода;
КодГорода="";
КодСтраны="";
КонецЕсли;
ТелефонГотов=ложь;
ВНачало=истина;
стрНомер=Новый Структура("КодСтраны,КодГорода,Телефон,Добавочный", КодСтраны,КодГорода,Телефон,Добавочный);
Рез.Добавить(стрНомер);
КонецЕсли;
КонецЦикла;
Возврат Рез;
КонецФункции
Функция ТелефонныйНомерСобрать(агрТелефоны) Экспорт
Рез="";
Для Каждого стрТелефон из агрТелефоны Цикл
Телефон=стрТелефон.Телефон;
Если СтрДлина(Телефон)=6 Тогда
Делитель=3;
ИначеЕсли СтрДлина(Телефон)=7 Тогда
Делитель=3;
ИначеЕсли СтрДлина(Телефон)=8 Тогда
Делитель=4;
ИначеЕсли СтрДлина(Телефон)=4 Тогда
Делитель=2;
Иначе
Делитель=0;
КонецЕсли;
Если Делитель<>0 Тогда
Телефон=Сред(Телефон, 1, Делитель)+"-"+Сред(Телефон, Делитель+1);
КонецЕсли;
Рез=Рез
+?(Рез="","",",")
+?(стрТелефон.КодСтраны="", "", "+"+стрТелефон.КодСтраны)
+?(стрТелефон.КодГорода="", "" ,"("+стрТелефон.КодГорода+")")
+?(стрТелефон.Телефон="", "", Телефон) //добавить разбор по символам
+?(стрТелефон.Добавочный="","","#"+стрТелефон.Добавочный)
КонецЦикла;
Возврат Рез;
КонецФункции
Не самый красивый код, но работает, как часы. |