Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Попытка -Исключение (http://forums.kuban.ru/f1040/popytka_-isklyuchenie-4626567.html)

exzarch4 13.08.2013 16:40

Попытка -Исключение
 
Добрый день

Имеется процедура подсчета в строке не отрицательных чисел:

Процедура ПриНачалеРаботыСистемы()

ИсходнаяСтрока = "27.3 0 0 34";
ПолученнаяСтрока = СтрЗаменить(СокрЛП(ИсходнаяСтрока), " ", Символы.ПС);
ЧислоЦифр = 0;
Для Сч = 1 ПО СтрЧислоСтрок(ПолученнаяСтрока) Цикл
Если НЕ ПустаяСтрока(СтрПолучитьСтроку(ПолученнаяСтрока, Сч)) И

Число(СтрПолучитьСтроку(ПолученнаяСтрока, Сч)) >=0

Тогда

ЧислоЦифр = ЧислоЦифр + 1;

КонецЕсли;
КонецЦикла;

Предупреждение(ЧислоЦифр);

КонецПроцедуры

Если в переменную ИсходнаяСтрока = "27.3 0 0 34"; добавить слово (например "27.3 0 слово 0 34") , то строка
Число(СтрПолучитьСтроку(ПолученнаяСтрока, Сч)) >=0
выдаст ошибку.
Можно - ли здесь как то использовать оператор Попытка ? Или придется идти другим путем и разбивать строки на символы?

Jimbo 13.08.2013 18:10

можно

Reaper 13.08.2013 21:59

но не нужно. у тебя валидных 11 знаков - так сложно проверить?

exzarch4 15.08.2013 16:45

2-Reaper > 11 знаков - это от балды. Я ведь и другую строчку могу подставить.Я вообще, разные варианты условия пробовал. Вопрос про использование Попытки - это для самообучения. Я синтаксис 1с только-только начал осваивать, а учебный материал с примерами скудноват.

VZ 15.08.2013 17:05

3-Strim > Обучаться надо использовать функционал [b]правильно[/b].
Здесь (сабж) - использовать системное прерывание совсем не кошерно.
Разные строки? Используй набор процедур. Используй набор правил. Возьми как образец правила поисковиков (там же можно завести сложное условие поисковой строки, так?) - и сгенери универсальную процедуру замены одного выражения на другое.
Трюки, фичи - вредно.

VZ 15.08.2013 17:16

+4 Кстати, в сабжевом примере достаточно просканировать строку (предварительно) на вхождение "не цифр", используя функцию Код().

qweqwe123123 18.08.2013 22:19

Если СтрДлина(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(ИсходнаяСтрока," ",""),"9",""),"1",""),"2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9",""),"-","")) > 0 Тогда
Сообщить("Чо вы мне буквы в строку напхали?");
Возврат;
КонецЕсли;

qweqwe123123 18.08.2013 22:19

ой, вместо любой "9" поставить "0"

Reaper 18.08.2013 22:26

6-Зелёный тролль > Убил бы.

qweqwe123123 18.08.2013 22:29

8-Reaper > :-) жги запросом по строке :-)

qweqwe123123 18.08.2013 22:32

о! ещё забыл разделитель целой и дробной части

qweqwe123123 18.08.2013 22:39

можно в цикле, чтобы лучше читался код:

Проверяем = СтрЗаменить(СтрЗаменить(СтрЗаменить(ИсходнаяСтрока,"-","")," ",""),".","");
Для Счётчик = 0 по 9 Цикл
Проверяем = СтрЗаменить(Проверяем ,Строка(Счётчик),"");
КонецЦикла;

Если Проверяем <> "" Тогда
Сообщить("Дайте денег");
Возврат;
КонецЕсли;

а ещё круче будет если условие переписать вот так:
Если Проверяем <> "" Тогда
предупреждение("Хрена вам, раз цифры от букв не отличаете!",10);
СтатусВозврата(0);
Возврат;
КонецЕсли;

// с учётом что в ПриНачалеРаботыСистемы() это разместить

Reaper 19.08.2013 00:40

11-Зелёный тролль > Первый вариант был "лопни мои глаза", во втором у меня от "Строка(Счетчик)" из правого глаза слезы с кровью, он у меня послабже. Блин, ну всего-то 11 знаков, я тут даже с кодовой таблицей бы не морочился - не стоит оно того.

КонтрольнаяСтрока = "0123456789.";
ПроверяемаяСтрока = СтрЗаменить(Исходнаястрока, " ", "");
Для Инд = 1 По СтрДлина(ПроверяемаяСтрока) Цикл
ПроверяемыйСимвол = Сред(ПроверяемаяСтрока, Инд, 1);
Если Найти(КонтрольнаяСтрока, ПроверяемыйСимвол) = 0 Тогда
ВызватьИсключение("Неверный формат версии");
КонецЕсли
КонецЦикла;


P.S. Статус возвата в секции v8 - это 5!

qweqwe123123 19.08.2013 00:51

12-Reaper > нормально так, а если там вся строка = "9.99"

qweqwe123123 19.08.2013 00:54

12-Reaper > + хз про v8, тебе виднее.

qweqwe123123 19.08.2013 00:56

в v8 не силён, но по моему не катит

qweqwe123123 19.08.2013 00:56

видимо без правого глаза трудно...

qweqwe123123 19.08.2013 00:57

: - )

qweqwe123123 19.08.2013 00:59

аа, это у мея с правым глазом что-то, ты всю строку перебираешь.... мощно, она вообще могёт и длиннннннной быть, так то если

qweqwe123123 19.08.2013 01:01

нафига сравнивать каждый символ исхдный строки с форматной? достаточно определить в ней наличие символов, ненужных нам, имхо оно быстрее

Reaper 19.08.2013 01:10

А ты думаешь, что "СтрЗаменить" или "Найти" внутри себя всю строку не перебирает?

qweqwe123123 19.08.2013 01:36

уверен, что СтрЗаменить делает это быстрее, чем перебирать все символы исходной строки в цикле

qweqwe123123 19.08.2013 01:37

да блин, ИСходная строка вообще длинною в км может быть, Рипер, ты пьянее меня что ли? или сказывается менее продолжительное присутствие на Т1С?

qweqwe123123 19.08.2013 01:39

не, я конечно не отрицаю, что если в первых символах исходной строки уже идут буквы, то твой код могёт работать быстрее, но это надо знать наверняка, чтобы так было.

qweqwe123123 19.08.2013 01:52

побереги глаза... без них оптимальность кода пофигу. просот тут бывают темы, на самый быстрый алгоритм (простой - типа удаения строк ТЗ или поиска символов в строке и т.п.). редко, но бывают.
//может и ты чего озадачишь. автор темы не важен, алгоритм обычно запоминается. например, удаление строк от "-ТЗ.КоличествоСтрок по -1"
может я конечно не прав, но тогда давай примеры кода/строк для тестирования.

Uho 20.08.2013 09:29

буквы... цифры...
автору [b]неотрицательные[/b] числа нужны

bma1 20.08.2013 10:02

2(25) если так, то надо взять число пробелов +1 - получаем число "цифровых слов", потом вычитаем чило минусов - получаем число неотрицательных числовых слов. И, разумеется проверка на то, что у нас только числа.

GreenDragon 28.08.2013 16:52

[quote=bma1;31796426]2(25) если так, то надо взять число пробелов +1 - получаем число "цифровых слов", потом вычитаем чило минусов - получаем число неотрицательных числовых слов. И, разумеется проверка на то, что у нас только числа. [/quote]

Держи: " -12 - 48 0 15 8 2"

bma1 29.08.2013 12:24

2(27) "-" с последующим пробелом - это не число.

GreenDragon 30.08.2013 15:45

2(26) Если ты собрался "...проверка на то, что у нас только числа.", то к чему этот бред с "...надо взять число пробелов..."?

bma1 30.08.2013 16:15

2(29) Где бред? Проверить строку на наличие нецифровых символов сложно? а включить в эту последовательность проверку на недопустимость комбинаций "- ", ". " и (возможно) "-." заратустра не позволяет?

Helen1986 30.08.2013 18:14

(30) да не обращай внимания на (29). он так, лужу морщит

(30)
"надо взять число пробелов..."
- только предварительно сделать замену двух подряд идущих пробелов на один (в цикле пока не кончатся)
-учесть наличие (или отсутствие ) пробела после последнего числа
- и так далее

smaharbA 01.09.2013 19:40

Сп=Новый СписокЗначений;
Сп.ТипЗначения=Новый ОписаниеТипов("Число");
...
...
Сп.Всавить(0,СокрЛП(СтрПолучитьСтроку(ПолученнаяСтрока, Сч));
...
...
Сп.Получить(0).Значение >=0

Ядрён батон 03.09.2013 09:32

// Функция проверяет наличие в строке только цифр
//
// Параметры
// СтрокаПроверки - Строка для проверки только цифр
//
// Возвращаемое значение:
// Булево
//
Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, УчитыватьЛидирующиеНули = Истина, УчитыватьПробелы = Истина) Экспорт

Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
Возврат Ложь;
КонецЕсли;

Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда
Возврат Истина;
КонецЕсли;

Если НЕ УчитыватьПробелы Тогда
СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", "");
КонецЕсли;

Если НЕ УчитыватьЛидирующиеНули Тогда
НомерПервойЦифры = 0;
Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
НомерПервойЦифры = НомерПервойЦифры + 1;
КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
Если КодСимвола <> 48 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
СтрокаПроверки = Сред(СтрокаПроверки, НомерПервойЦифры);
КонецЕсли;

Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
Если НЕ (КодСимвола >= 48 И КодСимвола <= 57) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;

Возврат Истина;

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

smaharbA 03.09.2013 10:02

(33) че за бред ?

Ядрён батон 03.09.2013 10:06

34-smaharbA > это из типовой УПП функция

smaharbA 03.09.2013 10:39

понял, позырил, ужасна

qweqwe123123 03.09.2013 10:59

//*******************************************
Процедура Сформировать()

СчетчикНеотрицательныхЧисел = 0;

ПроверяемаяСтрока = СтрЗаменить(ИсхСтрока,",","?");
ПроверяемаяСтрока = """" + СтрЗаменить(ПроверяемаяСтрока," ",""",""") + """";

сзПроверяемаяСтрока = СоздатьОбъект("СписокЗначений");
сзПроверяемаяСтрока.ИзСтрокиСРазделителями(ПроверяемаяСтрока);

Для сч = 1 по сзПроверяемаяСтрока.РазмерСписка() Цикл
ПроверяемаяСтрока = "";
ПроверяемоеЧисло = сзПроверяемаяСтрока.ПолучитьЗначение(сч,ПроверяемаяСтрока);
Если Строка(Число(ПроверяемоеЧисло)) = ПроверяемоеЧисло Тогда
Если Число(ПроверяемоеЧисло) >= 0 Тогда
СчетчикНеотрицательныхЧисел = СчетчикНеотрицательныхЧисел + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;

Сообщить("Количество неотрицательных чисел = " + СчетчикНеотрицательныхЧисел);

КонецПроцедуры

VZ 03.09.2013 13:09

33-Ядрён батон > Мдя... Душераздирающее зрелище. Во-первых, забыт [b]неразрывный пробел[/b]. Что есть смертельных грех, ибо тестирование Строка(2013) вернет Ложь, что [em]какбЕ[/em] странно ;)
Во-вторых, на кой ляд вообще "лидирующие нули" (в параметре и модуле), если функция возвращает единственное ИСТИНА/ЛОЖЬ независимо от их наличия?

VZ 03.09.2013 13:09

37-Зелёный тролль > К тебе это тоже относится ;)


Текущее время: 07:16. Часовой пояс GMT +3.