0
- 02.03.2019 - 07:45
|
Исходные данные Строка содержимое " комиссия: 11 343.91. актив" Необходимо получить (извлечь) число 11343.91 Прошу поделится примером | | ||
1
- 02.03.2019 - 08:17
|
Цифры = "1234567890."; Для НомСимвола = 1 По СтрДлина(Слово) Цикл ТекущийСимвол =Сред(Слово, НомСимвола, 1); Если не Найти(Цифры, ТекущийСимвол) = 0 Тогда ЧислоСтр = ЧислоСтр+ТекущийСимвол; Ну и естественно лишняя точкой(а может быть запятая) или цифра в тексте приведет к неправильному результату. | | ||
2
- 02.03.2019 - 10:10
| Можно просто удалить символ разделителя триад и затем преобразовать строку в число | | ||
3
- 02.03.2019 - 11:18
| У него не только триады. " комиссия: 11 343.91. актив". Ещё убирать последнюю точку или проверять что бы точка была между цифрам. А потом окажется что вариантов текста гораздо больше. | | ||
4
- 02.03.2019 - 11:49
| (3)Я комиссию с активом упустил, еще не совсем проснулся Вариантов море. Твой способ более универсальный, спору нет. А так, можно например ".актив" и "комиссия" заменить на "". Не бином Ньютона | | ||
5
- 02.03.2019 - 12:15
|
Эх, 1Сники... Даже из уже поставленных условий программисту должно быть ясно: одним циклом не обойтись. Алгоритм должен быть таким: 1. В цикле ищем первую цифру (0123456789) в строке. 2. Во втором цикле формируем выходную строку по примеру из (1). Цикл начинаем с позиции, найденной в п.1 и прерываем на первом же нецифровом символе (кроме пробела, его просто пропускаем) 3. Проверяем этот нецифровой символ, если это точка - проверяем следующие два символа: где гарантия, что не будет строки " комиссия: 11 343. актив"? Если эти символы - цифры, то к выходной строке добавляем точку и эти два символа (дробная часть). Работа программиста на этом закончена, а код пусть кодеры напишут. | | ||
6
- 02.03.2019 - 12:39
|
(5)надо смотреть задачу, если строка всегда имеет такой формат, то я бы все таки просто вырезал лишнее слева и справа, либо СтрЗаменить, либо Сред,Лев,Прав А вообще надо смотреть откуда такие строки появились, может там поправить ) | | ||
7
- 02.03.2019 - 12:49
| 1. Программиста, предлагающего лишний цикл переименовать в кодера. 2. После цикла из (1) в ЧислоСтр проверить последний символ и если это "."- то вернуть строку без последнего символа. | | ||
8
- 02.03.2019 - 13:19
| Цитата:
Если Слово=" комиссия: 11 343.91. актив" Тогда ЧислоСтр="11 343.91"; КонецЕсли; Программист же обязан предположить: а если там окажется две точки? Или три? Надеюсь, идея понятна? Если нет, то объясняю: по уму эти точки надо удалять в цикле. А если не исключать и наличие точек в начале строки - в двух циклах. Ы? P.S. Хотя, конечно, можно извратиться: Цифры = "1234567890"; Для НомСимвола = 1 По СтрДлина(Слово) Цикл ТекущийСимвол =Сред(Слово, НомСимвола, 1); Если ТекущийСимвол = "." Тогда ЧислоСтр = ЧислоСтр+" "; ИначеЕсли Найти(Цифры, ТекущийСимвол) > 0 Тогда ЧислоСтр = ЧислоСтр+ТекущийСимвол; КонецЕсли; КонецЦикла; ЧислоСтр = СтрЗаменить(СокрЛП(ЧислоСтр)," ","."); Но это, как говорится, "на любителя". | | ||
9
- 02.03.2019 - 13:34
| ПРИКЛАДНОЙ программст не Ванга, ему не надо ничего предполагать. Есть контекст задачи и в нем работаем. Изменится контекст, изменится и решение. И в этом нет никакого позора. Дали такое задание, так решили. Это не значит, что решили плохо, это значит, что решили в контексте требований заказчика. А если в строке появятся другие символы, то это проблема заказчик. Наш заказчик в (1) именно так обозначил проблему, а не как то иначе. Будет иначе, будут иные решения | | ||
10
- 02.03.2019 - 14:02
| Цитата:
а так в целом я за вариант в (5) | | ||
11
- 02.03.2019 - 14:29
| Цитата:
Все что ты написал в (5) можно сделать в одном цикле. Это раз. На поставленную задачу в "0" я ответ дал. Это два Ну и три. Если вопрос стоит сделать универсальную функцию, то твой вариант от универсальной функции так же далек. Он не предполагает что число может быть вида 123.1 или 123.123 или вида .123 Так что если учите кодить учите правильно. | | ||
12
- 02.03.2019 - 14:35
| Верное замечание, это уже я поддался менталитету "ПРИКЛАДНОГО программиста" и сузил задачу до суммы - то есть, как она была поставлена автором ветки. А вообще, можно написать решение задачи и в одном цикле, надо только на каждом шаге проверять результат и точку. Например, через ЗначениеЗаполнено(ЧислоСтр) и логическую переменную ЕстьТочка. То есть, пока ЗначениеЗаполнено(ЧислоСтр)=Ложь - пропускаем всё, кроме цифр. Как только стало ЗначениеЗаполнено(ЧислоСтр)=Истина - проверяем и точку, если совпадает (первая) - ЕстьТочка=Истина. Если цифра - добавляем к строке, но сначала проверяем ЕстьТочка - если Истина, то перед цифрой добавляем и точку. Первая же НЕ цифра и НЕ точка при ЗначениеЗаполнено(ЧислоСтр)=Истина - прерываем цикл. Там еще парочка проверок всплывет, но писать идеальный код ради "победы" на форуме - лениво. | | ||
13
- 02.03.2019 - 14:44
| Зацепил, зацепил, не переживай. Поставленную задачу решает и код из (8) Причем, оба варианта. ;-P Добавлять ничего не стану - в (12) все сказано. | | ||
14
- 02.03.2019 - 14:54
| Не оба а все три варианта. | | ||
15
- 02.03.2019 - 17:46
| Коллеги спасибо всем большое, отдельное спасибо Begemot и Ткачик | | ||
16
- 02.03.2019 - 21:19
|
вообще-то, программист 1Сник не парится, когда нужно написать ещё один цикл для обхода строки. потому что программист 1Сник всегда знает ресурсоёмкость своего алгоритма. в данном случае добавление ещё одного цикла - никак не увеличит ресурсоёмкость (никак - от слова совсем). Ни на миллионную долю секунды. это ведь всего лишь ещё один обход строки ограниченной длины. А не обход всех записей регистра, к примеру. | | ||
17
- 02.03.2019 - 21:20
|
поэтому не нужно себя ограничивать ложно понятым правилом эффективности кода вы лучше научитесь не выполнять запросы в цикле - вот это действительно повлияет на эффективность | | ||
18
- 03.03.2019 - 21:42
|
RegExp = Новый COMОбъект("VBScript.RegExp"); RegExp.Pattern = "\d*\.+\d*"; ИсходныйТекст = " комиссия: 11 343.91. актив"; Сообщить(RegExp.Execute(СтрЗаменить(ИсходныйТекст, " ","")).Item(0).Value); | | ||
19
- 03.03.2019 - 22:25
|
18-buh > увы Цитата:
http://www.donland.ru/documents/Ob-u...7&itemId=28300 вот нету там COM-Объектов, в этом якобы "отечественном" :))) ПО | | ||
20
- 03.03.2019 - 22:49
| 18-buh >Ещё один способ одеть трусы через голову. | | ||
21
- 04.03.2019 - 00:19
| +20 НО потенциально рабочий, в отличии от варианта Ткачика в (5). | | ||
22
- 04.03.2019 - 01:39
| (21) М-да. Вот уж кого я не просто "зацепил", а подвесил: автор уже получил все, что хотел, а он все чего-то доказывает. | | ||
23
- 04.03.2019 - 08:19
|
(22) "Не зацепил а подвесил". Батенька - да вы нас просто расмешили. И смешить продолжаете. Извергли на всех огромный ушак г@вна. Назвали все предложенные варианты "говнокодом" а всех "говнокодерами". И ... представили публики своё "творение". Алгоритм поиска чисел, основннный на . Вот только конфуз вышел. Забыли при про минус, тире и точку. Знаки, которые могут быть перед "первой цифрой". И тут уже двумя циклами не обойдемся. Нужен третий - "в лево" от "первой цифры". Не менее спорный и 2 пункт "супер" алгоритма. Цитата:
Цитата:
Так что это фиаско алгоритма. Ну или попробуй убедить в обратном. Покупаем попкорн. | | ||
24
- 11.03.2019 - 07:43
|
если ты не прикладной - нарисуй вагон другой ). количество циклов - вторично. красота кода - должна чувствоваться интуитивно нутром, а не подсчитываться по арифметическим критериям, имхо. а слабо вообще без циклов? ) | |
| Интернет-форум Краснодарского края и Краснодара |