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

Попытка -Исключение

Гость
0 - 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
выдаст ошибку.
Можно - ли здесь как то использовать оператор Попытка ? Или придется идти другим путем и разбивать строки на символы?



Гость
1 - 13.08.2013 - 18:10
можно
Гость
2 - 13.08.2013 - 21:59
но не нужно. у тебя валидных 11 знаков - так сложно проверить?
Гость
3 - 15.08.2013 - 16:45
2-Reaper > 11 знаков - это от балды. Я ведь и другую строчку могу подставить.Я вообще, разные варианты условия пробовал. Вопрос про использование Попытки - это для самообучения. Я синтаксис 1с только-только начал осваивать, а учебный материал с примерами скудноват.
Гость
4 - 15.08.2013 - 17:05
3-Strim > Обучаться надо использовать функционал правильно.
Здесь (сабж) - использовать системное прерывание совсем не кошерно.
Разные строки? Используй набор процедур. Используй набор правил. Возьми как образец правила поисковиков (там же можно завести сложное условие поисковой строки, так?) - и сгенери универсальную процедуру замены одного выражения на другое.
Трюки, фичи - вредно.
Гость
5 - 15.08.2013 - 17:16
+4 Кстати, в сабжевом примере достаточно просканировать строку (предварительно) на вхождение "не цифр", используя функцию Код().
Гость
6 - 18.08.2013 - 22:19
Если СтрДлина(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗа менить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаме нить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗамени ть(ИсходнаяСтрока," ",""),"9",""),"1",""),"2",""),"3",""),"4",""),"5", ""),"6",""),"7",""),"8",""),"9",""),"-","")) > 0 Тогда
Сообщить("Чо вы мне буквы в строку напхали?");
Возврат;
КонецЕсли;
Гость
7 - 18.08.2013 - 22:19
ой, вместо любой "9" поставить "0"
Гость
8 - 18.08.2013 - 22:26
6-Зелёный тролль > Убил бы.
Гость
9 - 18.08.2013 - 22:29
8-Reaper > :-) жги запросом по строке :-)
Гость
10 - 18.08.2013 - 22:32
о! ещё забыл разделитель целой и дробной части
Гость
11 - 18.08.2013 - 22:39
можно в цикле, чтобы лучше читался код:

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

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

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

// с учётом что в ПриНачалеРаботыСистемы() это разместить
Гость
12 - 19.08.2013 - 00:40
11-Зелёный тролль > Первый вариант был "лопни мои глаза", во втором у меня от "Строка(Счетчик)" из правого глаза слезы с кровью, он у меня послабже. Блин, ну всего-то 11 знаков, я тут даже с кодовой таблицей бы не морочился - не стоит оно того.

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


P.S. Статус возвата в секции v8 - это 5!
Гость
13 - 19.08.2013 - 00:51
12-Reaper > нормально так, а если там вся строка = "9.99"
Гость
14 - 19.08.2013 - 00:54
12-Reaper > + хз про v8, тебе виднее.
Гость
15 - 19.08.2013 - 00:56
в v8 не силён, но по моему не катит
Гость
16 - 19.08.2013 - 00:56
видимо без правого глаза трудно...
Гость
17 - 19.08.2013 - 00:57
: - )
Гость
18 - 19.08.2013 - 00:59
аа, это у мея с правым глазом что-то, ты всю строку перебираешь.... мощно, она вообще могёт и длиннннннной быть, так то если
Гость
19 - 19.08.2013 - 01:01
нафига сравнивать каждый символ исхдный строки с форматной? достаточно определить в ней наличие символов, ненужных нам, имхо оно быстрее
Гость
20 - 19.08.2013 - 01:10
А ты думаешь, что "СтрЗаменить" или "Найти" внутри себя всю строку не перебирает?
Гость
21 - 19.08.2013 - 01:36
уверен, что СтрЗаменить делает это быстрее, чем перебирать все символы исходной строки в цикле
Гость
22 - 19.08.2013 - 01:37
да блин, ИСходная строка вообще длинною в км может быть, Рипер, ты пьянее меня что ли? или сказывается менее продолжительное присутствие на Т1С?
Гость
23 - 19.08.2013 - 01:39
не, я конечно не отрицаю, что если в первых символах исходной строки уже идут буквы, то твой код могёт работать быстрее, но это надо знать наверняка, чтобы так было.
Гость
24 - 19.08.2013 - 01:52
побереги глаза... без них оптимальность кода пофигу. просот тут бывают темы, на самый быстрый алгоритм (простой - типа удаения строк ТЗ или поиска символов в строке и т.п.). редко, но бывают.
//может и ты чего озадачишь. автор темы не важен, алгоритм обычно запоминается. например, удаление строк от "-ТЗ.КоличествоСтрок по -1"
может я конечно не прав, но тогда давай примеры кода/строк для тестирования.
Uho
25 - 20.08.2013 - 09:29
буквы... цифры...
автору неотрицательные числа нужны
26 - 20.08.2013 - 10:02
2(25) если так, то надо взять число пробелов +1 - получаем число "цифровых слов", потом вычитаем чило минусов - получаем число неотрицательных числовых слов. И, разумеется проверка на то, что у нас только числа.
Гость
27 - 28.08.2013 - 16:52
Цитата:
Сообщение от bma1 Посмотреть сообщение
2(25) если так, то надо взять число пробелов +1 - получаем число "цифровых слов", потом вычитаем чило минусов - получаем число неотрицательных числовых слов. И, разумеется проверка на то, что у нас только числа.
Держи: " -12 - 48 0 15 8 2"
28 - 29.08.2013 - 12:24
2(27) "-" с последующим пробелом - это не число.
Гость
29 - 30.08.2013 - 15:45
2(26) Если ты собрался "...проверка на то, что у нас только числа.", то к чему этот бред с "...надо взять число пробелов..."?
30 - 30.08.2013 - 16:15
2(29) Где бред? Проверить строку на наличие нецифровых символов сложно? а включить в эту последовательность проверку на недопустимость комбинаций "- ", ". " и (возможно) "-." заратустра не позволяет?
Гость
31 - 30.08.2013 - 18:14
(30) да не обращай внимания на (29). он так, лужу морщит

(30)
"надо взять число пробелов..."
- только предварительно сделать замену двух подряд идущих пробелов на один (в цикле пока не кончатся)
-учесть наличие (или отсутствие ) пробела после последнего числа
- и так далее
Гость
32 - 01.09.2013 - 19:40
Сп=Новый СписокЗначений;
Сп.ТипЗначения=Новый ОписаниеТипов("Число");
...
...
Сп.Всавить(0,СокрЛП(СтрПолучитьСтроку(ПолученнаяСт рока, Сч));
...
...
Сп.Получить(0).Значение >=0
Гость
33 - 03.09.2013 - 09:32
// Функция проверяет наличие в строке только цифр
//
// Параметры
// СтрокаПроверки - Строка для проверки только цифр
//
// Возвращаемое значение:
// Булево
//
Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, УчитыватьЛидирующиеНули = Истина, УчитыватьПробелы = Истина) Экспорт

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

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

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

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

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

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

КонецФункции
Гость
34 - 03.09.2013 - 10:02
(33) че за бред ?
Гость
35 - 03.09.2013 - 10:06
34-smaharbA > это из типовой УПП функция
Гость
36 - 03.09.2013 - 10:39
понял, позырил, ужасна
Гость
37 - 03.09.2013 - 10:59
//*******************************************
Процедура Сформировать()

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

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

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

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

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

КонецПроцедуры
Гость
38 - 03.09.2013 - 13:09
33-Ядрён батон > Мдя... Душераздирающее зрелище. Во-первых, забыт неразрывный пробел. Что есть смертельных грех, ибо тестирование Строка(2013) вернет Ложь, что какбЕ странно ;)
Во-вторых, на кой ляд вообще "лидирующие нули" (в параметре и модуле), если функция возвращает единственное ИСТИНА/ЛОЖЬ независимо от их наличия?
Гость
39 - 03.09.2013 - 13:09
37-Зелёный тролль > К тебе это тоже относится ;)


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






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