![]() |
![]() |
![]() |
|
Убрать в строке все символы кроме цифр | ☑ | ||
---|---|---|---|---|
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, можно отсеить номер телефона по наличию букв между цифрами.
Вообще-то, программа делает всё автоматом, а потом те места, которые ей показались странными отображает пользователю, чтобы он понял, что к чему (или печатает на бумаге, чтобы секретарша просто повычёркивала те места, которые программа не поняла). |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |