К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Извлечь число из строки

Гость
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
Цитата:
Сообщение от Begemot Посмотреть сообщение
После цикла из (1) в ЧислоСтр проверить последний символ и если это "."- то вернуть строку без последнего символа.
Кодера, предлагающего такое, переименовать в "г...внокодера". Потому что от этого всего один шаг до эпического:

Если Слово=" комиссия: 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
Цитата:
Сообщение от Ткачик Посмотреть сообщение
3. Проверяем этот нецифровой символ, если это точка - проверяем следующие два символа. Если эти символы - цифры, то к выходной строке добавляем точку и эти два символа (дробная часть).
п.п.1-2 согласна, этот пункт - нет. Вес - это, как правило, три символа после запятой, курс может быть и шесть символов. Так что не проверяем не "два следующих символа", а "до упора", т.е. пока не закончатся цифры после первой точки.
а так в целом я за вариант в (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
Цитата:
Сообщение от Begemot Посмотреть сообщение
Зацепил значит.
Зацепил, зацепил, не переживай.
Цитата:
Сообщение от Begemot Посмотреть сообщение
На поставленную задачу в "0" я ответ дал. Это два
Поставленную задачу решает и код из (8) Причем, оба варианта. ;-P

Добавлять ничего не стану - в (12) все сказано.
14 - 02.03.2019 - 14:54
Цитата:
Сообщение от Ткачик Посмотреть сообщение
Поставленную задачу решает и код из (8) Причем, оба варианта. ;-P
Не оба а все три варианта.
Гость
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 > увы


Цитата:
Правительство Ростовской области

Постановление
от 13.12.2018 № 803
г. Ростов-на-Дону

Об утверждении Плана мероприятий по переходу органов исполнительной власти Ростовской области на использование отечественного офисного программного обеспечения на период до 2020 года
это не шутка:
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) "Не зацепил а подвесил". Батенька - да вы нас просто расмешили. И смешить продолжаете. Извергли на всех огромный ушак г@вна. Назвали все предложенные варианты "говнокодом" а всех "говнокодерами". И ... представили публики своё "творение". Алгоритм поиска чисел, основннный на
Цитата:
Сообщение от Ткачик Посмотреть сообщение
1. В цикле ищем первую цифру (0123456789) в строке.
. Вот только конфуз вышел. Забыли при про минус, тире и точку. Знаки, которые могут быть перед "первой цифрой". И тут уже двумя циклами не обойдемся. Нужен третий - "в лево" от "первой цифры".
Не менее спорный и 2 пункт "супер" алгоритма.
Цитата:
Сообщение от Ткачик Посмотреть сообщение
2. Во втором цикле формируем выходную строку по примеру из (1). Цикл начинаем с позиции, найденной в п.1 и прерываем на первом же нецифровом символе (кроме пробела, его просто пропускаем)
А как же разделители триад? Нет если
Цитата:
Сообщение от Ткачик Посмотреть сообщение
Программист же обязан предположить: а если там окажется две точки? Или три?
программмсит обязан предположить про точки - то забыть про триады он ни как не может.
Так что это фиаско алгоритма. Ну или попробуй убедить в обратном. Покупаем попкорн.
Гость
24 - 11.03.2019 - 07:43
если ты не прикладной - нарисуй вагон другой ).
количество циклов - вторично.
красота кода - должна чувствоваться интуитивно нутром, а не подсчитываться по арифметическим критериям, имхо.

а слабо вообще без циклов? )


К списку вопросов






Copyright ©, Все права защищены