Имя: Пароль:
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, можно отсеить номер телефона по наличию букв между цифрами.
Вообще-то, программа делает всё автоматом, а потом те места, которые ей показались странными отображает пользователю, чтобы он понял, что к чему (или печатает на бумаге, чтобы секретарша просто повычёркивала те места, которые программа не поняла).
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн