Имя: Пароль:
1C
 
Убрать в строке все символы кроме цифр
0 Алексей Петрович
 
05.01.09
14:45
Всех с прошедшими и предстоящими!
Есть задачка.
Имеем строку с номером телефона, плюс куча всяких примечаний и знаков препинания. Необходимо оставить только цифры. Делаю так:

    НомерСимвола = 1;
    ИтоговаяСтрока = "";
    ИсходнаяСтрока = "Офис 50-14-18";
    Пока НомерСимвола <= СтрДлина(ИсходнаяСтрока) Цикл
         Попытка
              Цифра = Число(Сред(ИсходнаяСтрока, НомерСимвола, 1));
              ИтоговаяСтрока = ИтоговаяСтрока + Строка(Цифра);
         Исключение
         КонецПопытки;
         НомерСимвола = НомерСимвола + 1;
    КонецЦикла;

Но проблем в том, что функция "Число" преобразуте пробелы, дефисы в 0.
Других идей, кроме как 10 раз сравнить символ с цифрами от 0 до 9 нет?
1 ТелепатБот
 
гуру
05.01.09
14:45
2 Sadovnikov
 
05.01.09
14:47
(0) А считать код символа религия не позволяет?
3 kumena
 
05.01.09
14:49
Функция ТолькоЦифрыИзСтроки(Знач СтрокаПроверки, УчитыватьЛидирующиеНули = Истина, УчитыватьПробелы = Истина) Экспорт
   
   Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
       Возврат 0;
   КонецЕсли;
   
   Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда
       Возврат 0;
   КонецЕсли;
   
   Если НЕ УчитыватьПробелы Тогда
       СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", "");
   КонецЕсли;
   
   Стр = "";
   Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
       КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
       Цифра = Сред(СтрокаПроверки, а, 1);
       Если (КодСимвола >= 48 И КодСимвола <= 57) Тогда
           Стр = Стр + Цифра;
       КонецЕсли;
   КонецЦикла;

   Если НЕ УчитыватьЛидирующиеНули Тогда
       Стр = Число(Стр);
   КонецЕсли;
   
   Возврат Стр;
   
КонецФункции
4 Mikeware
 
05.01.09
14:50
(2) А зачем?
5 Sadovnikov
 
05.01.09
14:50
(4) Чтобы понять - число это или нет :)
6 skunk
 
05.01.09
14:51
чисДлина = СтрДлина(ИсходнаяСтрока);
для х = 1 по чисДлина цикл
 Цифра = Сред(ИсходнаяСтрока, х, 1);
 если ((Цифра > "/") и (Цифра > ":")) тогда
     ИтоговаяСтрока = ИтоговаяСтрока + Цифра;
 конецесли;
КонецЦикла;



как-то так
7 Алексей Петрович
 
05.01.09
14:51
(2)Спасибо.
Мы, как бычно, легких путей не ищем:)
8 Defender aka LINN
 
05.01.09
14:51
Можно еще делать "Найти("0123456789", Символ) = 0" :)
9 kumena
 
05.01.09
14:52
может кто знает, типовая функция есть в 8 для этого?
10 Sadovnikov
 
05.01.09
14:52
(6) Со знаками в Если не напутал? :)
11 Fragster
 
гуру
05.01.09
14:53
RegExp = CreateObject("VBScript.RegExp"); // здесь под восьмерку переделай
   
   RegExp.IgnoreCase = Истина; //Игнорировать регистр
   RegExp.Global = Истина; //Поиск всех вхождений шаблона
   RegExp.MultiLine = Истина; //Многострочный режим
   
   
   RegExp.Pattern = "[^0-9]";
   
   стр=RegExp.Replace(стр, "");
   Сообщить(стр);
12 skunk
 
05.01.09
14:54
(10)ага напутал... ну я же сказал... как-то так
13 Sadovnikov
 
05.01.09
14:54
(12) "ну я же сказал... как-то так" - слив засчитан :))
14 Алексей Петрович
 
05.01.09
14:56
(9) Типовой похоже нет. Хотя было бы не плохо..
15 Fragster
 
гуру
05.01.09
14:57
(11) Новый ComОбъект, чтоли
16 Mikeware
 
05.01.09
14:58
(4) А в "прогрессивной платформе" сравнение строк не канает?
17 Алексей Петрович
 
05.01.09
14:59
(8)Элегантно.. Первое место:)
18 Mikeware
 
05.01.09
15:00
Кстати, аффтар, а если цифры есть в камментах?
Номера телефонов все записаны стандартно? Или как попало?
19 skunk
 
05.01.09
15:03
я бы вообще-то до другого докапался )))
20 Алексей Петрович
 
05.01.09
15:03
(18)Маловероятно. Но тут уж ничего не поделаешь... Да и ручной труд никто не отменял.
21 Алексей Петрович
 
05.01.09
15:04
(19)До чего же?
22 skunk
 
05.01.09
15:07
(21)1С своеобразно сравнивает строки ))) ... условие в (6) никогда не выполниться


Цифра = "5";
?(Цифра > "/", "истина", "ложь"); //"истина"
?(Цифра < ":", "истина", "ложь"); //"ложь"
23 Mikeware
 
05.01.09
15:08
(20) что "маловероятно"?
Я бы делал через Регулярные выражения...
24 Fragster
 
гуру
05.01.09
15:09
(23) эээ... меня точно никто не видит?
25 Sadovnikov
 
05.01.09
15:10
(24) Да заценили уже давно. Или тебе так сильно общественное поощрение необходимо? :)
26 Fragster
 
гуру
05.01.09
15:11
(25) а то :)
27 у лю 427
 
05.01.09
15:14
а слабо сделать без оператора ЕСЛИ?


Function СухойОстаток(С)
   СухойОстаток = "";
   for Индекс = 1 to StrLen(С) do
       СухойОстаток = СухойОстаток + Ъ[Asc(Left (С, 1))];
   endDo;
   return  СухойОстаток;
EndFunction
28 Алексей Петрович
 
05.01.09
15:16
(23)Там бардак тот еще. Телефон может быть записан как угодно. И "52-52-52", и "36- 12,,50 спросить гену3" и т.д. Если расскажите как средствами 1С анализировать сей момент, буду признателен..
29 Sadovnikov
 
05.01.09
15:18
(28)Формочка, на которой показывается эта строчка и поле для ввода с надписью: "Гад! Ну-ка быстро вбил нормальный номер телефона!!!".
30 Алексей Петрович
 
05.01.09
15:19
(29) Элегентно:)
Но задача сейчас обработать то, что уже введено. Текущая работа контролируется жестко.
31 Злобный Йожег
 
05.01.09
15:19
(28) Маску назначь полю телефона...
32 Sadovnikov
 
05.01.09
15:21
(30) "Но задача сейчас обработать то, что уже введено" - обрати внимание, на предлагаемой форме - 2 поля. В первом - уже вбитый в базу тескт, из которого пользователю мягко и вежливо предлагается извлечь нормальный номер телефона :)
33 Алексей Петрович
 
05.01.09
15:25
(32) И все же задача невыполнима. Элементов в справочнике тысячи. Забивалось реально как попало. Не ожидал, что у людей такая фантазия:) Делать несколько масок? Хм..
34 Кузнецов Максим
 
05.01.09
15:27
не надо никаких масок.
пусть руками все перебивают.
фокусничать в данном случае нецелесообразно, да и себе дороже.
35 Алексей Петрович
 
05.01.09
15:29
(34)Вот я и хочу оставить одни цифры. Пусть разбираются дальше сами.
36 Sadovnikov
 
05.01.09
15:32
(35) Может оказаться, что сделаешь только хуже...
Например из строки "Сергей-2, дом 15, 3-й сотовый телефон украли, новый городской - 02".
37 Кузнецов Максим
 
05.01.09
15:33
как верно подметил (18), ИсходнаяСтрока = "Офис №1 50-14-18";
выдаст тебе 1501418
38 Планета Обезьян
 
05.01.09
15:37
(37) удалить все слова и все одиночные цифры, а оставшиеся проанализировать на предмет наличия дефисов и "кучности"
39 Sadovnikov
 
05.01.09
15:38
(38) Ага. И еще свериться телефонной базой данных...
40 Алексей Петрович
 
05.01.09
16:21
Реквизит называется "Номер телефона", поэтому другие цифры там маловероятны.
Хотя "удалить одиночные цифры" - идея мне понравилась.
41 Mikeware
 
05.01.09
16:29
(24) Ну не с таким же паттерном...
----------------
Найдено яндексом за 2 минуты:
шаблон номера телефона.

^(\(\d+\)){0,1}\d{3}-\d{2}-\d{2}$\

^ – Этот символ указывает, что здесь начинается искомая строка.
(– Код города располагается внутри скобок.
\( – Открывающая скобка.
\d+ – После скобки должен располагаться код города – одна или несколько цифр.
\) – Закрывающая скобка.
) – Закрывающая скобка – метасимвол, указывающий, что здесь заканчивается группируемое выражение (в данном случае, код города).
{0,1} – Этот метасимвол указывает, что выражение в скобках (код города) может повторяться от нуля до одного раза, то есть код города можно не указывать.
\d{3}-\d{2}-\d{2} – Три группы цифр – одна группа по три и две по две цифры. Цифры разделены дефисами.
$ – Этот знак показывает, что здесь заканчивается подстрока.
--------------
http://archive.williamspublishing.com/cgi-bin/materials.cgi?isbn=5-8459-0713-6 - программки проверки регулярных выражений...
42 у лю 427
 
05.01.09
16:55
(41) полная фигня... заставляет писать номер в виде
(хххх) ххх-хх-хх

телефоны же часто пишут в виде, удобном для запоминания
например

333-333-22 или
22-22-565 или
1-345-345
43 у лю 427
 
05.01.09
16:55
к тому же сейчас много коротких номеров.... непонятной длины
44 Mikeware
 
05.01.09
16:59
(42) Это просто пример.
Что мешает проверить
^(\(\d+\)){0,1}\d{3}-\d{2}-\d{2}$\
и
^(\d+){0,1}\d{3}-\d{2}-\d{2}$\
и
^\d{3}-\d{2}-\d{2}$\
и
^\d{2}-\d{2}-\d{2}$\
и
^\d{3}-\d{3}$\
?
45 DTrofimov
 
05.01.09
21:50
Строка(Число(Симв))
Если пришли к тому же символу - значит циферка
46 Torquader
 
06.01.09
15:04
Например, офис № 1 123 456 - данное выражение системой в любом случае будет понято, как 1123456 и никуда от этого не денешься. С другой стороны 123 456 Гоша 93, можно отсеить номер телефона по наличию букв между цифрами.
Вообще-то, программа делает всё автоматом, а потом те места, которые ей показались странными отображает пользователю, чтобы он понял, что к чему (или печатает на бумаге, чтобы секретарша просто повычёркивала те места, которые программа не поняла).
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший