По теме из базы знаний
- Универсальные формы ввода даты, числа, строки, Виртуальная клавиатура, форма выбора из списка (для сенсорных экранов). Управляемые и обычные формы.
- Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке
- Обертка функций Excel на русском. Ускорение процесса разработки.
- Получаем уровень группировки ячейки табличного документа
- Библиотека процедур и функций для технологической платформы "1С: Предприятие 7.7"
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Что-то вроде этого :
Где СтрокаДанных - исходная строка например "as1122ddd3221fff"
МасЧисел - конечный результат (в нашем случае 1122, 3221)
Процедура КнопкаВыполнитьНажатие(Кнопка)
МасЧисел = новый Массив;
ИсхДанные = СокрЛП(СтрокаДанных);
ТекЧислоСтр = "";
Пока СтрДлина(ИсхДанные)>0 цикл
ОбработкаПрерыванияПользователя();
Сим = Лев(ИсхДанные,1);
ЕСли Сим>="0" и Сим<="9" тогда
// накапливаем число
ТекЧислоСтр = ТекЧислоСтр+Сим;
иначеЕсли НЕ ПустаяСтрока(ТекЧислоСтр) тогда
// если есть число сохраняем его
МасЧисел.Добавить(Число(ТекЧислоСтр));
ТекЧислоСтр = "";
иначе
ТекЧислоСтр = "";
КонецЕсли;
ИсхДанные = Сред(ИсхДанные,2);
КонецЦикла;
Если НЕ ПустаяСтрока(ТекЧислоСтр) тогда
// если на конце есть число
МасЧисел.Добавить(Число(ТекЧислоСтр));
КонецЕсли;
Сообщить("---------");
Для каждого эл из МасЧисел цикл
сообщить(эл);
КонецЦикла;
КонецПроцедуры
ПоказатьГде СтрокаДанных - исходная строка например "as1122ddd3221fff"
МасЧисел - конечный результат (в нашем случае 1122, 3221)
(1) ponaroshku, все верно, потому что такой функции нет :)
Но ее можно написать самому. Для этого нужно пройтись в цикле по каждому символу в строке и проверить, цифра ли это.
Я бы предложил следующий вариант:
Но ее можно написать самому. Для этого нужно пройтись в цикле по каждому символу в строке и проверить, цифра ли это.
Я бы предложил следующий вариант:
Функция НайтиЧислаВСтроке(Строка = "ыдлвапдлцоук234124ывпо555епрст1я") // для примера возьмем такую строку
МассивЧисел = Новый Массив; // сюда поместим все найденные числа. В данном примере в массив должно попасть 3 числа: 234224, 555 и 1
СтрокаЧисел = "";
Для Индекс = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Индекс, 1); // Перебираем все сиволы из нашей строки
Если КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57 Тогда // Код нуля - 48, код 9-ки - 57
СтрокаЧисел = СтрокаЧисел + Символ;
ИначеЕсли СтрДлина(СтрокаЧисел) > 0 Тогда
МассивЧисел.Добавить(Число(СтрокаЧисел));
КонецЕсли;
КонецЦикла;
Возврат МассивЧисел
КонецФункции
Показать
Darkoderr; kat888; Светлый ум; user1819931; SIrina9; NatashaSK; user1619761; Apolonov-Erik; malikov_pro; Silver0030; Ujine1313; Nefilimus; Simonov_NPM; aleksdiez; imbaZeratul; zannv; Boulala; AlekSandra29; alexandrmishinn; soulnechnii; x_x; klinval; valafan; App0st0l; vladir; svilsa; Wersia; Chloroform; unknown181538; ponaroshku;
+30
–
Ответить
(8) ponaroshku, Вам же hulio в (4) привел как раз нужный вам код, разве что в нем небольшой недочет - нет очистки СтрокаЧисла в цикле, вот поправленный, проверил - работает
Функция НайтиЧислаВСтроке(Строка = "ыдлвапдлцоук234124ывпо555епрст1я") // для примера возьмем такую строку
МассивЧисел = Новый Массив; // сюда поместим все найденные числа. В данном примере в массив должно попасть 3 числа: 234224, 555 и 1
СтрокаЧисел = "";
Для Индекс = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Индекс, 1); // Перебираем все сиволы из нашей строки
Если КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57 Тогда // Код нуля - 48, код 9-ки - 57
СтрокаЧисел = СтрокаЧисел + Символ;
ИначеЕсли СтрДлина(СтрокаЧисел) > 0 Тогда
МассивЧисел.Добавить(Число(СтрокаЧисел));
СтрокаЧисел = "";
КонецЕсли;
КонецЦикла;
Возврат МассивЧисел
КонецФункции
Показать
Чтобы видело число в конце строки:
Функция НайтиЧислаВСтроке(Строка = "ыдлвапдлцоук234124ывпо555епрст1я") // для примера возьмем такую строку
МассивЧисел = Новый Массив; // сюда поместим все найденные числа. В данном примере в массив должно попасть 3 числа: 234224, 555 и 1
СтрокаЧисел = "";
Для Индекс = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Индекс, 1); // Перебираем все сиволы из нашей строки
Если КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57 Тогда // Код нуля - 48, код 9-ки - 57
СтрокаЧисел = СтрокаЧисел + Символ;
ИначеЕсли СтрДлина(СтрокаЧисел) > 0 Тогда
МассивЧисел.Добавить(Число(СтрокаЧисел));
СтрокаЧисел = "";
КонецЕсли;
КонецЦикла;
Если СтрДлина(СтрокаЧисел)>0 Тогда
МассивЧисел.Добавить(Число(СтрокаЧисел));
КонецЕсли;
Возврат МассивЧисел
КонецФункции
Показать
(0) а результат "ыдлвапдлцоук234124ывпо341" такой строки какой? ничего против приведенных способов не имею, но я бы использовал регулярные выражения. Например паттерн: \d+
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.MultiLine = Ложь;
RegExp.Pattern = "\d+";
Matches= RegExp.Execute("ыдлвапдлцоук234124ывпоапрар");
ОчиститьСообщения();
Для Сч = 0 по Matches.Count()-1 Цикл
Match = Matches.Item(Сч);
Сообщить("" + Match.Value+ "");
Submatches = Match.Submatches;
Для сч1=0 по Submatches.Count()-1 Цикл
Submatch = Submatches.Item(Сч1);
Сообщить(Символы.Таб + "" + Submatch+ "");
КонецЦикла;
КонецЦикла;
Показать
В упр. формах можно сделать так.
Результат = 1 524
Если нужно чтобы вывести разные числа из данной строки, то можно немного изменить код
Результат будет массив с числами 15,24 в строковом виде
&НаКлиенте
Процедура Команда1(Команда)
ЧислоИзСтроки = СтрокуВЧисло("ыфвавыа15ыца24ауу");
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция СтрокуВЧисло(СтрокаСЧислом)
МассивСтрок = СтрРазделить(СтрокаСЧислом, "0123456789", Ложь);
Для Каждого ТекСтрока из МассивСтрок Цикл
СтрокаСЧислом = СтрЗаменить(СтрокаСЧислом, ТекСтрока, "");
КонецЦикла;
Возврат Число(СтрокаСЧислом);
КонецФункции
ПоказатьРезультат = 1 524
Если нужно чтобы вывести разные числа из данной строки, то можно немного изменить код
&НаКлиенте
Процедура Команда1(Команда)
ЧислоИзСтроки = СтрокуВЧисло("ыфвавыа15ыца24ауу");
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция СтрокуВЧисло(СтрокаСЧислом)
МассивСтрок = СтрРазделить(СтрокаСЧислом, "0123456789", Ложь);
Для Каждого ТекСтрока из МассивСтрок Цикл
СтрокаСЧислом = СтрЗаменить(СтрокаСЧислом, ТекСтрока, Символы.ПС);
КонецЦикла;
МассивЧисел = СтрРазделить(СтрокаСЧислом, Символы.ПС, Ложь); //получатся массив чисел в строковом виде, которые спокойно можно преобразовать в число
Возврат МассивЧисел;
КонецФункции
ПоказатьРезультат будет массив с числами 15,24 в строковом виде
(14)
Не работает, если в исходной строке есть наборы повторяющихся символов, например так "1оло2лолол3ол4оло5ололол6,кеке"
&НаКлиентеНаСервереБезКонтекста
Функция СтрокуВЧисло(СтрокаСЧислом)
МассивСтрок = СтрРазделить(СтрокаСЧислом, "0123456789", Ложь);
Для Каждого ТекСтрока из МассивСтрок Цикл
СтрокаСЧислом = СтрЗаменить(СтрокаСЧислом, ТекСтрока, Символы.ПС);
КонецЦикла;
МассивЧисел = СтрРазделить(СтрокаСЧислом, Символы.ПС, Ложь); //получатся массив чисел в строковом виде, которые спокойно можно преобразовать в число
Возврат МассивЧисел;
КонецФункции
Функция СтрокуВЧисло(СтрокаСЧислом)
МассивСтрок = СтрРазделить(СтрокаСЧислом, "0123456789", Ложь);
Для Каждого ТекСтрока из МассивСтрок Цикл
СтрокаСЧислом = СтрЗаменить(СтрокаСЧислом, ТекСтрока, Символы.ПС);
КонецЦикла;
МассивЧисел = СтрРазделить(СтрокаСЧислом, Символы.ПС, Ложь); //получатся массив чисел в строковом виде, которые спокойно можно преобразовать в число
Возврат МассивЧисел;
КонецФункции
Не работает, если в исходной строке есть наборы повторяющихся символов, например так "1оло2лолол3ол4оло5ололол6,кеке"
(14)
Вот так работает правильно.
Функция СтрокуВЧисло(СтрокаСЧислом) экспорт
МассивСтрок = СтрРазделить(СтрокаСЧислом, "0123456789", Ложь);
тз=новый таблицазначений;
тз.Колонки.Добавить("текст");
тз.Колонки.Добавить("длина",новый описаниетипов("число"));
Для Каждого ТекСтрока из МассивСтрок Цикл
приемник=тз.Добавить();
приемник.текст=ТекСтрока;
приемник.длина=СтрДлина(ТекСтрока);
конеццикла;
тз.Сортировать("длина убыв");
Для Каждого запись из тз Цикл
ТекСтрока=запись.текст;
СтрокаСЧислом = СтрЗаменить(СтрокаСЧислом, ТекСтрока, Символы.ПС);
КонецЦикла;
МассивЧисел = СтрРазделить(СтрокаСЧислом, Символы.ПС, Ложь); //получатся массив чисел в строковом виде, которые спокойно можно преобразовать в число
Возврат МассивЧисел;
КонецФункции
ПоказатьВот так работает правильно.
Немного улучшенный вариант с регулярными выражениями - понимает десятичные дроби:
Функция ДостатьЧислаИзСтроки(ИсходнаяСтрока, разделители = ".,")
Масс = Новый Массив;
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.MultiLine = Ложь;
//RegExp.Pattern = "\d+";
RegExp.Pattern = "-*\d+[" + разделители + "]\d*";
Matches= RegExp.Execute(ИсходнаяСтрока);
ОчиститьСообщения();
Для Сч = 0 по Matches.Count()-1 Цикл
Match = Matches.Item(Сч);
Попытка
Масс.Добавить(Число(Match.Value));
Исключение
Сообщить(Match.Value);
Сообщить("Ошибка : "+ ОписаниеОшибки());
КонецПопытки;
//Сообщить("" + Match.Value+ "");
Submatches = Match.Submatches;
Для сч1=0 по Submatches.Count()-1 Цикл
Submatch = Submatches.Item(Сч1);
Попытка
Масс.Добавить(Число(Submatch.Value));
Исключение
Сообщить("Ошибка : "+ ОписаниеОшибки());
КонецПопытки;
// Сообщить(Символы.Таб + "" + Submatch+ "");
КонецЦикла;
КонецЦикла;
Возврат Масс;
КонецФункции // ()
Показать
Извините: нашел ошибочку в своей реплике - вот исправленный вариант
Функция ДостатьЧислаИзСтроки(ИсходнаяСтрока, разделители = ".,")
Масс = Новый Массив;
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.MultiLine = Ложь;
//RegExp.Pattern = "\d+";
RegExp.Pattern = "-*\d+[" + разделители + "]*\d*";
Matches= RegExp.Execute(ИсходнаяСтрока);
ОчиститьСообщения();
Для Сч = 0 по Matches.Count()-1 Цикл
Match = Matches.Item(Сч);
Попытка
Масс.Добавить(Число(Match.Value));
Исключение
Сообщить(Match.Value);
Сообщить("Ошибка : "+ ОписаниеОшибки());
КонецПопытки;
//Сообщить("" + Match.Value+ "");
Submatches = Match.Submatches;
Для сч1=0 по Submatches.Count()-1 Цикл
Submatch = Submatches.Item(Сч1);
Попытка
Масс.Добавить(Число(Submatch.Value));
Исключение
Сообщить("Ошибка : "+ ОписаниеОшибки());
КонецПопытки;
// Сообщить(Символы.Таб + "" + Submatch+ "");
КонецЦикла;
КонецЦикла;
Возврат Масс;
КонецФункции // ()
Функция ДостатьЧислаИзСтроки(ИсходнаяСтрока, разделители = ".,")
Масс = Новый Массив;
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.MultiLine = Ложь;
//RegExp.Pattern = "\d+";
RegExp.Pattern = "-*\d+[" + разделители + "]*\d*";
Matches= RegExp.Execute(ИсходнаяСтрока);
ОчиститьСообщения();
Для Сч = 0 по Matches.Count()-1 Цикл
Match = Matches.Item(Сч);
Попытка
Масс.Добавить(Число(Match.Value));
Исключение
Сообщить(Match.Value);
Сообщить("Ошибка : "+ ОписаниеОшибки());
КонецПопытки;
//Сообщить("" + Match.Value+ "");
Submatches = Match.Submatches;
Для сч1=0 по Submatches.Count()-1 Цикл
Submatch = Submatches.Item(Сч1);
Попытка
Масс.Добавить(Число(Submatch.Value));
Исключение
Сообщить("Ошибка : "+ ОписаниеОшибки());
КонецПопытки;
// Сообщить(Символы.Таб + "" + Submatch+ "");
КонецЦикла;
КонецЦикла;
Возврат Масс;
КонецФункции // ()
Вариант рекурсивного извлечения
Функция ИзвлечьЧисло(вхСтр,вхПоз=1) экспорт
где=СтрДлина(вхСтр)+1;
ок=ложь;
для ц=0 по 9 цикл
найти=СтрНайти(вхСтр,строка(ц),,вхПоз);
если найти > 0 тогда
где=min(где,найти);
ок=истина;
конецесли;
конеццикла;
если ок=истина тогда
ч=число(Сред(вхСтр,где,1));
д=2;
пока истина цикл
кандидат=Сред(вхСтр,где,д);
попытка
проверка=число(кандидат);
ч=проверка ;
д=д+1 ;
исключение
сообщить(ч);
прервать;
конецпопытки;
конеццикла;
ИзвлечьЧисло(вхСтр,где+д-1)
иначе
возврат(истина);
конецесли;
КонецФункции
Показать
ЛишниеСимволы = СтрСоединить(СтрРазделить(Строка, "0123456789"), "");
ЧистыйНомер = СтрСоединить(СтрРазделить(Строка, ЛишниеСимволы), "");
ЧистыйНомер = СтрСоединить(СтрРазделить(Строка, ЛишниеСимволы), "");
(33) немного доработать метод из
(26) и все корректно будет
(26) и все корректно будет
ЧисловоеЗначение = Число(Лев(СтрСоединить(СтрРазделить("123.50 руб.", СтрСоединить(СтрРазделить("123.50 руб.", "0123456789."), ""), "")), СтрДлина((СтрСоединить(СтрРазделить("123.50 руб.", СтрСоединить(СтрРазделить("123.50 руб.", "0123456789."), ""), "")))) - 1)) //// на выходе получается 123.5
(33) Вот такую выхухоль откопал:
Функция ЧислоИзСтроки(Текст)
Длина = СтрДлина(Текст);
Текст = СтрЗаменить(Текст, ",", ".");
Результат = "0";
Для Сч = 1 По Длина Цикл Символ = Сред(Текст, Сч, 1); Если Найти("0123456789.", Символ) > 0 Тогда Результат = Результат + Символ КонецЕсли КонецЦикла;
ПозицияТочки = Найти(Результат, ".");
Если ПозицияТочки > 0 Тогда
ДробнаяЧасть = Сред(Результат, ПозицияТочки + 1);
Результат = Лев(Результат, ПозицияТочки) + СтрЗаменить(ДробнаяЧасть, ".", "");
КонецЕсли;
Возврат Число(Результат)
КонецФункции
Показать
вроде короче и проще (для другого алфавита - меняем буквы, спец. символы), это если оставляем числа с дробями,
если только целые, добавляем в разделитель - ".,"
Для номера документа можно взять последний элемент массива и преобразовать в число, чтобы убрать ведущие нули
если только целые, добавляем в разделитель - ".,"
СтрокаСЧислами = "1оло2лолол3ол4оло5ололол6,0ке";
// Это вся функция
РезультатМассив = СтрРазделить(СтрокаСЧислами,
"абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШ ЩЪЫЬЭЮЯ-_=/\",
Ложь);
// Конец функции
РезультатСтрокаКрасивоПоказать = СтрСоединить(РезультатМассив, " | ");
//1оло2лолол3ол4оло5ололол6,0ке" => "1 | 2 | 3 | 4 | 5 | 6,0"
ПоказатьДля номера документа можно взять последний элемент массива и преобразовать в число, чтобы убрать ведущие нули
Число(РезультатМассив[РезультатМассив.Количество()-1]) // "ТН-00005" => 5
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот