Функция: получить число из строки

1. ponaroshku 05.04.12 07:11 Сейчас в теме
Подскажи функцию, которая позволит из строки вида
"ыдлвапдлцоук234124ывпо"

вытащить число 234124

В СП смотрела, не нашла:(
SIrina9; Apolonov-Erik; Silver0030; +3 Ответить
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Поручик 4674 05.04.12 07:15 Сейчас в теме
(1) Цикл по строке с проверкой кода символа, запись цифрового символа в отдельную переменную и преобразование её в число по завершении цикла.
Fatenm; ponaroshku; +2 Ответить
3. Ягг 495 05.04.12 07:21 Сейчас в теме
(1) Что-то вроде этого :

Процедура КнопкаВыполнитьНажатие(Кнопка)
	МасЧисел 	= новый Массив;
	ИсхДанные 	= СокрЛП(СтрокаДанных);
	
	ТекЧислоСтр = "";
	Пока СтрДлина(ИсхДанные)>0 цикл
		ОбработкаПрерыванияПользователя();
		
		Сим = Лев(ИсхДанные,1);
		ЕСли Сим>="0" и  Сим<="9" тогда
			// накапливаем число
			ТекЧислоСтр = ТекЧислоСтр+Сим;
		иначеЕсли НЕ ПустаяСтрока(ТекЧислоСтр) тогда
			// если есть число сохраняем его
			МасЧисел.Добавить(Число(ТекЧислоСтр));
			ТекЧислоСтр = "";
			
		иначе	
			ТекЧислоСтр = "";
			
		КонецЕсли;	
		
		ИсхДанные = Сред(ИсхДанные,2);
	КонецЦикла;	
	
	Если  НЕ ПустаяСтрока(ТекЧислоСтр) тогда
			// если на конце есть число
			МасЧисел.Добавить(Число(ТекЧислоСтр));
	КонецЕсли;	

	Сообщить("---------");
	Для каждого эл из МасЧисел цикл
		сообщить(эл);
	КонецЦикла;	
	
	
КонецПроцедуры
Показать


Где СтрокаДанных - исходная строка например "as1122ddd3221fff"
МасЧисел - конечный результат (в нашем случае 1122, 3221)
x_x; andryushkina; Wersia; ponaroshku; +4 Ответить
5. charushkin 104 05.04.12 07:24 Сейчас в теме
(3) Ягг, опередил слегка :)
6. Ягг 495 05.04.12 07:26 Сейчас в теме
7. ponaroshku 05.04.12 07:33 Сейчас в теме
(3) спасибо огромное :)

(4) спасибо:) я просто думала, что может быть функция такая, т.к. ничего криминального она не делает
4. charushkin 104 05.04.12 07:23 Сейчас в теме
(1) ponaroshku, все верно, потому что такой функции нет :)
Но ее можно написать самому. Для этого нужно пройтись в цикле по каждому символу в строке и проверить, цифра ли это.
Я бы предложил следующий вариант:


Функция НайтиЧислаВСтроке(Строка = "ыдлвапдлцоук234124ывпо555епрст1я") // для примера возьмем такую строку

   МассивЧисел = Новый Массив; // сюда поместим все найденные числа. В данном примере в массив должно попасть 3 числа: 234224, 555 и 1

   СтрокаЧисел = "";

   Для Индекс = 1 По СтрДлина(Строка) Цикл
   
      Символ = Сред(Строка, Индекс, 1); // Перебираем все сиволы из нашей строки

      Если КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57 Тогда // Код нуля - 48, код 9-ки - 57
         СтрокаЧисел = СтрокаЧисел + Символ;
      ИначеЕсли СтрДлина(СтрокаЧисел) > 0 Тогда
         МассивЧисел.Добавить(Число(СтрокаЧисел));
      КонецЕсли;
   
   КонецЦикла;

   Возврат МассивЧисел

КонецФункции

Показать
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; +29 Ответить
20. Azim_burkhanov 11.03.20 12:41 Сейчас в теме
я столкнулся с проблемой когда нужно извлечь все цифры из строки "что-то;типа123 штук". (1) возвращает пустой массив. и код под постом тоже ничего не возвращает((
8. ponaroshku 11.04.12 09:01 Сейчас в теме
Апну тему:)

Работает правильно

Но столкнулась с проблемой, если строка вида
12312 много текста 1221!!! текст "555"

выдает 123121221555 одним числом

в виде нескольких чисел не получить? По примеру - 12312 1221 555
9. xalker 48 11.04.12 09:10 Сейчас в теме
(8) ponaroshku, Вам же hulio в (4) привел как раз нужный вам код, разве что в нем небольшой недочет - нет очистки СтрокаЧисла в цикле, вот поправленный, проверил - работает
Функция НайтиЧислаВСтроке(Строка = "ыдлвапдлцоук234124ывпо555епрст1я") // для примера возьмем такую строку

   МассивЧисел = Новый Массив; // сюда поместим все найденные числа. В данном примере в массив должно попасть 3 числа: 234224, 555 и 1

   СтрокаЧисел = "";

   Для Индекс = 1 По СтрДлина(Строка) Цикл
   
      Символ = Сред(Строка, Индекс, 1); // Перебираем все сиволы из нашей строки

      Если КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57 Тогда // Код нуля - 48, код 9-ки - 57
         СтрокаЧисел = СтрокаЧисел + Символ;
      ИначеЕсли СтрДлина(СтрокаЧисел) > 0 Тогда
         МассивЧисел.Добавить(Число(СтрокаЧисел));
         СтрокаЧисел = "";
      КонецЕсли;
   
   КонецЦикла;

   Возврат МассивЧисел

КонецФункции
Показать
user1819931; user1114234; user1090556; artfa; mamedoss; unknown181538; +6 Ответить
10. ponaroshku 11.04.12 10:04 Сейчас в теме
(9) прошу прощения
я по (3) делала

да, (4) работает

спасибо всем:)
11. unknown181538 154 14.03.13 13:27 Сейчас в теме
Чтобы видело число в конце строки:
Функция НайтиЧислаВСтроке(Строка = "ыдлвапдлцоук234124ывпо555епрст1я") // для примера возьмем такую строку

   МассивЧисел = Новый Массив; // сюда поместим все найденные числа. В данном примере в массив должно попасть 3 числа: 234224, 555 и 1

   СтрокаЧисел = "";

   Для Индекс = 1 По СтрДлина(Строка) Цикл
   
      Символ = Сред(Строка, Индекс, 1); // Перебираем все сиволы из нашей строки

      Если КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57 Тогда // Код нуля - 48, код 9-ки - 57
         СтрокаЧисел = СтрокаЧисел + Символ;
      ИначеЕсли СтрДлина(СтрокаЧисел) > 0 Тогда
         МассивЧисел.Добавить(Число(СтрокаЧисел));
		 СтрокаЧисел = "";
      КонецЕсли;
   
   КонецЦикла;
   Если СтрДлина(СтрокаЧисел)>0 Тогда
	   МассивЧисел.Добавить(Число(СтрокаЧисел));
   КонецЕсли;
   
   Возврат МассивЧисел

КонецФункции
Показать
Ujine1313; user1090556; Batman; klinval; +4 Ответить
12. cool.vlad4 2 14.03.13 13:55 Сейчас в теме
(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+ "");
	КонецЦикла;
КонецЦикла;
Показать
xacan1; axelerleo; +2 2 Ответить
28. olezhe 21 23.01.23 18:35 Сейчас в теме
(12) Не универсально. На сервере под линуксом не взлетит.
cleaner_it; +1 Ответить
13. hromovanton 6 13.11.15 09:19 Сейчас в теме
Интересно было бы узнать, какой из методов (программный или метод регулярных выражений) отработает быстрее при больших объемах обработки информации.
leaguener; +1 Ответить
14. APTEM_SLV 164 22.01.19 11:03 Сейчас в теме
В упр. формах можно сделать так.

&НаКлиенте
Процедура Команда1(Команда)
	ЧислоИзСтроки = СтрокуВЧисло("ыфвавыа15ыца24ауу");
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция СтрокуВЧисло(СтрокаСЧислом)
	МассивСтрок = СтрРазделить(СтрокаСЧислом, "0123456789", Ложь);
	Для Каждого ТекСтрока из МассивСтрок Цикл 
		СтрокаСЧислом = СтрЗаменить(СтрокаСЧислом, ТекСтрока, "");
	КонецЦикла;
	
	Возврат Число(СтрокаСЧислом);
КонецФункции
Показать

Результат = 1 524

Если нужно чтобы вывести разные числа из данной строки, то можно немного изменить код

&НаКлиенте
Процедура Команда1(Команда)
	ЧислоИзСтроки = СтрокуВЧисло("ыфвавыа15ыца24ауу");
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция СтрокуВЧисло(СтрокаСЧислом)
	МассивСтрок = СтрРазделить(СтрокаСЧислом, "0123456789", Ложь);
	Для Каждого ТекСтрока из МассивСтрок Цикл 
		СтрокаСЧислом = СтрЗаменить(СтрокаСЧислом, ТекСтрока, Символы.ПС);
	КонецЦикла;
	
	МассивЧисел = СтрРазделить(СтрокаСЧислом, Символы.ПС, Ложь);   //получатся массив чисел в строковом виде, которые спокойно можно преобразовать в число
	
	Возврат МассивЧисел;
КонецФункции
Показать

Результат будет массив с числами 15,24 в строковом виде
yurazyuraz; olezhe; Eeeehhhh; chemezov; Serg O.; Docaru; marku; user817897; ulterior; +9 Ответить
21. Azim_burkhanov 11.03.20 12:45 Сейчас в теме
все спасибо. (14) прекрасно работает
23. scientes 289 28.09.22 15:29 Сейчас в теме
(14)
&НаКлиентеНаСервереБезКонтекста
Функция СтрокуВЧисло(СтрокаСЧислом)
МассивСтрок = СтрРазделить(СтрокаСЧислом, "0123456789", Ложь);
Для Каждого ТекСтрока из МассивСтрок Цикл
СтрокаСЧислом = СтрЗаменить(СтрокаСЧислом, ТекСтрока, Символы.ПС);
КонецЦикла;

МассивЧисел = СтрРазделить(СтрокаСЧислом, Символы.ПС, Ложь); //получатся массив чисел в строковом виде, которые спокойно можно преобразовать в число

Возврат МассивЧисел;
КонецФункции


Не работает, если в исходной строке есть наборы повторяющихся символов, например так "1оло2лолол3ол4оло5ололол6,кеке"
24. scientes 289 29.09.22 08:59 Сейчас в теме
(14)
Функция СтрокуВЧисло(СтрокаСЧислом) экспорт
        МассивСтрок = СтрРазделить(СтрокаСЧислом, "0123456789", Ложь);
	
	тз=новый таблицазначений;
	тз.Колонки.Добавить("текст");
	тз.Колонки.Добавить("длина",новый описаниетипов("число"));
	Для Каждого ТекСтрока из МассивСтрок Цикл 
		приемник=тз.Добавить();
		приемник.текст=ТекСтрока;
		приемник.длина=СтрДлина(ТекСтрока);
	конеццикла;	
	
	тз.Сортировать("длина убыв");
	
	
	Для Каждого запись из тз Цикл 
		ТекСтрока=запись.текст;
        СтрокаСЧислом = СтрЗаменить(СтрокаСЧислом, ТекСтрока, Символы.ПС);
    КонецЦикла;
    
    МассивЧисел = СтрРазделить(СтрокаСЧислом, Символы.ПС, Ложь);   //получатся массив чисел в строковом виде, которые спокойно можно преобразовать в число
    
    Возврат МассивЧисел;
КонецФункции


Показать


Вот так работает правильно.
15. Zlaya-Ferio 3 07.02.19 14:07 Сейчас в теме
А если Строка типа "12345/15 Какая-то фраза" и нужно получить 12345/15? По всем функциям могу получить только 1234515, а как оставить "/"?
16. Zlaya-Ferio 3 07.02.19 14:24 Сейчас в теме
17. ValeraS2010 84 01.08.19 14:39 Сейчас в теме
Немного улучшенный вариант с регулярными выражениями - понимает десятичные дроби:


Функция ДостатьЧислаИзСтроки(ИсходнаяСтрока, разделители =  ".,")
Масс = Новый Массив;
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+ "");
    КонецЦикла;
КонецЦикла;
	
Возврат Масс;
КонецФункции // ()
Показать
18. ValeraS2010 84 04.09.19 17:28 Сейчас в теме
Извините: нашел ошибочку в своей реплике - вот исправленный вариант

Функция ДостатьЧислаИзСтроки(ИсходнаяСтрока, разделители = ".,")
Масс = Новый Массив;
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+ "");
КонецЦикла;
КонецЦикла;

Возврат Масс;
КонецФункции // ()
marku; user970589; +2 Ответить
19. Azim_burkhanov 11.03.20 12:39 Сейчас в теме
Доброе народ. все вышеуказанные куски кода на какой версии сделаны?? ибо на 8,3 УФ ни один из них не работает(((
22. scientes 289 28.09.22 15:02 Сейчас в теме
Вариант рекурсивного извлечения

Функция ИзвлечьЧисло(вхСтр,вхПоз=1) экспорт
	
	где=СтрДлина(вхСтр)+1;
	ок=ложь;
	для ц=0 по 9 цикл
		найти=СтрНайти(вхСтр,строка(ц),,вхПоз);
		если  найти > 0 тогда 
			где=min(где,найти);
			ок=истина;
		конецесли;
	конеццикла;	
	
	
	
	если ок=истина	тогда
			ч=число(Сред(вхСтр,где,1));
			д=2;
			пока истина цикл
				кандидат=Сред(вхСтр,где,д);
				попытка 
					проверка=число(кандидат);
					ч=проверка				;
					д=д+1	            	;
				исключение
					сообщить(ч);
					прервать;
				конецпопытки;	
			конеццикла;	
			ИзвлечьЧисло(вхСтр,где+д-1)
	иначе
			возврат(истина);
    конецесли;
	
КонецФункции



Показать
25. scientes 289 29.09.22 09:01 Сейчас в теме
(22) Этот вариант работает и для чисел с десятичной точкой.
26. user1136877 28.10.22 13:26 Сейчас в теме
ЛишниеСимволы = СтрСоединить(СтрРазделить(Строка, "0123456789"), "");
ЧистыйНомер = СтрСоединить(СтрРазделить(Строка, ЛишниеСимволы), "");
user1824493; kichigin_al; Golovolom; Altone1976; Deda; Izumov; Torin57; knuck; marku; teca; Romeo_1c_programmer; Raskad; cleaner_it; gonnahard; vv2; Alex_E; loginRS; additive; LOSTuK; chemezov; tolyan_ekb; +21 Ответить
27. chemezov 47 14.01.23 18:37 Сейчас в теме
29. loginRS 25.01.23 20:42 Сейчас в теме
(26)
ЛишниеСимволы
(25)
Это гениально! 2 строчки и такой функционал!
30. starik-2005 3039 26.01.23 10:11 Сейчас в теме
(29)
2 строчки
Зачем останавливаться? Временная переменная там точно не нужна, так что это одна строчка.
32. Raskad 10 14.04.23 15:08 Сейчас в теме
(26)
Прикрепленные файлы:
35. user895038 21.03.24 15:00 Сейчас в теме
(26)
ЛишниеСимволы = СтрСоединить(СтрРазделить(Строка, "0123456789"), "");
ЧистыйНомер = СтрСоединить(СтрРазделить(Строка, ЛишниеСимволы), "");


Очень похоже на эксперта по эксель, который пересел на 1с :)
31. user1793070 14.04.23 14:44 Сейчас в теме
Спасибо тебе, добрый человек!
33. Serg_2015 19.04.23 13:57 Сейчас в теме
Все предложенные способы хороши только для целых чисел. Вариант, когда разделитель дробной части встречается в строке ещё раз (например, "123.50 руб.") корректно не отрабатывает никто.
34. SlavaKron 19.04.23 14:35 Сейчас в теме
(33) Вот такую выхухоль откопал:
Функция ЧислоИзСтроки(Текст)
	Длина = СтрДлина(Текст);
	Текст = СтрЗаменить(Текст, ",", ".");
	Результат = "0";
	Для Сч = 1 По Длина Цикл Символ = Сред(Текст, Сч, 1); Если Найти("0123456789.", Символ) > 0 Тогда Результат = Результат + Символ КонецЕсли КонецЦикла;
	ПозицияТочки = Найти(Результат, ".");
	Если ПозицияТочки > 0 Тогда
		ДробнаяЧасть = Сред(Результат, ПозицияТочки + 1);
		Результат = Лев(Результат, ПозицияТочки) + СтрЗаменить(ДробнаяЧасть, ".", "");
	КонецЕсли;
	Возврат Число(Результат)
КонецФункции
Показать
schanya; TokarevV; Breas; +3 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот