Помогите решить задачу (1С)
Водится строка, содержащая буквы, целые неотрицательные числа и иные символы. Требуется все числа, которые встречаются в строке, поместить в строку разделив запятой с пробелом. Например, если дана строка "data 48 call 9 read13 blank0a", то в строке ответ должны оказаться числа 48, 9, 13 и 0.
Ответы (1 шт):
Автор решения: Бауржан Мамыш
→ Ссылка
Функция ЗадачаСоStackOverflow(ИсходнаяСтрока)
ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрока);
Цифры = "0123456789";
РезультирующаяСтрока = "";
ЧислоСтрокой = "";
Для НомерСимвола = 1 по ДлинаИсходнойСтроки Цикл
//Считываем очередной символ из исходной строки
СимволИсходнойСтроки = Сред(ИсходнаяСтрока,НомерСимвола,1);
Если СтрНайти(Цифры, СимволИсходнойСтроки) <> 0 Тогда
//Собираем число из цифр в строку
ЧислоСтрокой = ЧислоСтрокой + СимволИсходнойСтроки;
Иначе
//Очередной символ НЕ число
//тогда проверяем было ли сформировано число
//если да то записываем его в результирующую строку и очищаем его
Если НЕ ПустаяСтрока(ЧислоСтрокой) Тогда
РезультирующаяСтрока = РезультирующаяСтрока + ЧислоСтрокой + ", ";
ЧислоСтрокой = "";
КонецЕсли;
КонецЕсли;
КонецЦикла;
//уберем лишнюю запятую с пробелом из результирующей строки
РезультирующаяСтрока =
Лев(РезультирующаяСтрока, СтрДлина(РезультирующаяСтрока)-2);
Возврат РезультирующаяСтрока;
КонецФункции
Функция ЗадачаСоStackOverflow_2(ИсходнаяСтрока)
ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрока);
Цифры = "0123456789";
РезультирующаяСтрока = "";
ЧислоСтрокой = "";
//[1] Инициализация пустой строкой, при первом заходе пригодится
ЗапятаяСПробелом = "";
Для НомерСимвола = 1 по ДлинаИсходнойСтроки Цикл
СимволИсходнойСтроки = Сред(ИсходнаяСтрока, НомерСимвола, 1);
Если СтрНайти(Цифры, СимволИсходнойСтроки) <> 0 Тогда
ЧислоСтрокой = ЧислоСтрокой + СимволИсходнойСтроки;
Иначе
Если НЕ ПустаяСтрока(ЧислоСтрокой) Тогда
//[2] Поменяем форимрование итоговой строки
//теперь добавляем ее перед числовой строкой
РезультирующаяСтрока = РезультирующаяСтрока + ЗапятаяСПробелом + ЧислоСтрокой;
ЧислоСтрокой = "";
//[3] Начиная со второго прохода это запятая с пробелом
ЗапятаяСПробелом = ", ";
КонецЕсли;
КонецЕсли;
КонецЦикла;
//Для случая когда строка заканчивается числом
Если НЕ ПустаяСтрока(ЧислоСтрокой) Тогда
РезультирующаяСтрока = РезультирующаяСтрока + ЗапятаяСПробелом + ЧислоСтрокой;
КонецЕсли;
Возврат РезультирующаяСтрока;
КонецФункции
Функция ЗадачаСоStackOverflow_3(ИсходнаяСтрока)
ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрока);
Цифры = "0123456789";
РезультирующаяСтрока = "";
ЧислоСтрокой = "";
//[1] Теперь возмем массив куда будем совать найденные числа
МассивНайденныхЧисел = Новый Массив();
Для НомерСимвола = 1 по ДлинаИсходнойСтроки Цикл
СимволИсходнойСтроки = Сред(ИсходнаяСтрока, НомерСимвола, 1);
Если СтрНайти(Цифры, СимволИсходнойСтроки) <> 0 Тогда
ЧислоСтрокой = ЧислоСтрокой + СимволИсходнойСтроки;
Иначе
Если НЕ ПустаяСтрока(ЧислоСтрокой) Тогда
//[2] Нашли - добавили
МассивНайденныхЧисел.Добавить(ЧислоСтрокой);
ЧислоСтрокой = "";
КонецЕсли;
КонецЕсли;
КонецЦикла;
//Если Строка заканчивается "числом"
Если НЕ ПустаяСтрока(ЧислоСтрокой) Тогда
МассивНайденныхЧисел.Добавить(ЧислоСтрокой);
КонецЕсли;
//[3] Отправили массив в матрицу к нео - получили запятые на своих местах (сработает с 8.3.6)
РезультирующаяСтрока = СтрСоединить(МассивНайденныхЧисел, ", ");
Возврат РезультирующаяСтрока;
КонецФункции