[1] [2] |
Попытка -Исключение Добрый день Имеется процедура подсчета в строке не отрицательных чисел: Процедура ПриНачалеРаботыСистемы() ИсходнаяСтрока = "27.3 0 0 34"; ПолученнаяСтрока = СтрЗаменить(СокрЛП(ИсходнаяСтрока), " ", Символы.ПС); ЧислоЦифр = 0; Для Сч = 1 ПО СтрЧислоСтрок(ПолученнаяСтрока) Цикл Если НЕ ПустаяСтрока(СтрПолучитьСтроку(ПолученнаяСтрока, Сч)) И Число(СтрПолучитьСтроку(ПолученнаяСтрока, Сч)) >=0 Тогда ЧислоЦифр = ЧислоЦифр + 1; КонецЕсли; КонецЦикла; Предупреждение(ЧислоЦифр); КонецПроцедуры Если в переменную ИсходнаяСтрока = "27.3 0 0 34"; добавить слово (например "27.3 0 слово 0 34") , то строка Число(СтрПолучитьСтроку(ПолученнаяСтрока, Сч)) >=0 выдаст ошибку. Можно - ли здесь как то использовать оператор Попытка ? Или придется идти другим путем и разбивать строки на символы? |
можно |
но не нужно. у тебя валидных 11 знаков - так сложно проверить? |
2-Reaper > 11 знаков - это от балды. Я ведь и другую строчку могу подставить.Я вообще, разные варианты условия пробовал. Вопрос про использование Попытки - это для самообучения. Я синтаксис 1с только-только начал осваивать, а учебный материал с примерами скудноват. |
3-Strim > Обучаться надо использовать функционал [b]правильно[/b]. Здесь (сабж) - использовать системное прерывание совсем не кошерно. Разные строки? Используй набор процедур. Используй набор правил. Возьми как образец правила поисковиков (там же можно завести сложное условие поисковой строки, так?) - и сгенери универсальную процедуру замены одного выражения на другое. Трюки, фичи - вредно. |
+4 Кстати, в сабжевом примере достаточно просканировать строку (предварительно) на вхождение "не цифр", используя функцию Код(). |
Если СтрДлина(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(ИсходнаяСтрока," ",""),"9",""),"1",""),"2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9",""),"-","")) > 0 Тогда Сообщить("Чо вы мне буквы в строку напхали?"); Возврат; КонецЕсли; |
ой, вместо любой "9" поставить "0" |
6-Зелёный тролль > Убил бы. |
8-Reaper > :-) жги запросом по строке :-) |
о! ещё забыл разделитель целой и дробной части |
можно в цикле, чтобы лучше читался код: Проверяем = СтрЗаменить(СтрЗаменить(СтрЗаменить(ИсходнаяСтрока,"-","")," ",""),".",""); Для Счётчик = 0 по 9 Цикл Проверяем = СтрЗаменить(Проверяем ,Строка(Счётчик),""); КонецЦикла; Если Проверяем <> "" Тогда Сообщить("Дайте денег"); Возврат; КонецЕсли; а ещё круче будет если условие переписать вот так: Если Проверяем <> "" Тогда предупреждение("Хрена вам, раз цифры от букв не отличаете!",10); СтатусВозврата(0); Возврат; КонецЕсли; // с учётом что в ПриНачалеРаботыСистемы() это разместить |
11-Зелёный тролль > Первый вариант был "лопни мои глаза", во втором у меня от "Строка(Счетчик)" из правого глаза слезы с кровью, он у меня послабже. Блин, ну всего-то 11 знаков, я тут даже с кодовой таблицей бы не морочился - не стоит оно того. КонтрольнаяСтрока = "0123456789."; ПроверяемаяСтрока = СтрЗаменить(Исходнаястрока, " ", ""); Для Инд = 1 По СтрДлина(ПроверяемаяСтрока) Цикл ПроверяемыйСимвол = Сред(ПроверяемаяСтрока, Инд, 1); Если Найти(КонтрольнаяСтрока, ПроверяемыйСимвол) = 0 Тогда ВызватьИсключение("Неверный формат версии"); КонецЕсли КонецЦикла; P.S. Статус возвата в секции v8 - это 5! |
12-Reaper > нормально так, а если там вся строка = "9.99" |
12-Reaper > + хз про v8, тебе виднее. |
в v8 не силён, но по моему не катит |
видимо без правого глаза трудно... |
: - ) |
аа, это у мея с правым глазом что-то, ты всю строку перебираешь.... мощно, она вообще могёт и длиннннннной быть, так то если |
нафига сравнивать каждый символ исхдный строки с форматной? достаточно определить в ней наличие символов, ненужных нам, имхо оно быстрее |
А ты думаешь, что "СтрЗаменить" или "Найти" внутри себя всю строку не перебирает? |
уверен, что СтрЗаменить делает это быстрее, чем перебирать все символы исходной строки в цикле |
да блин, ИСходная строка вообще длинною в км может быть, Рипер, ты пьянее меня что ли? или сказывается менее продолжительное присутствие на Т1С? |
не, я конечно не отрицаю, что если в первых символах исходной строки уже идут буквы, то твой код могёт работать быстрее, но это надо знать наверняка, чтобы так было. |
побереги глаза... без них оптимальность кода пофигу. просот тут бывают темы, на самый быстрый алгоритм (простой - типа удаения строк ТЗ или поиска символов в строке и т.п.). редко, но бывают. //может и ты чего озадачишь. автор темы не важен, алгоритм обычно запоминается. например, удаление строк от "-ТЗ.КоличествоСтрок по -1" может я конечно не прав, но тогда давай примеры кода/строк для тестирования. |
буквы... цифры... автору [b]неотрицательные[/b] числа нужны |
2(25) если так, то надо взять число пробелов +1 - получаем число "цифровых слов", потом вычитаем чило минусов - получаем число неотрицательных числовых слов. И, разумеется проверка на то, что у нас только числа. |
[quote=bma1;31796426]2(25) если так, то надо взять число пробелов +1 - получаем число "цифровых слов", потом вычитаем чило минусов - получаем число неотрицательных числовых слов. И, разумеется проверка на то, что у нас только числа. [/quote] Держи: " -12 - 48 0 15 8 2" |
2(27) "-" с последующим пробелом - это не число. |
2(26) Если ты собрался "...проверка на то, что у нас только числа.", то к чему этот бред с "...надо взять число пробелов..."? |
2(29) Где бред? Проверить строку на наличие нецифровых символов сложно? а включить в эту последовательность проверку на недопустимость комбинаций "- ", ". " и (возможно) "-." заратустра не позволяет? |
(30) да не обращай внимания на (29). он так, лужу морщит (30) "надо взять число пробелов..." - только предварительно сделать замену двух подряд идущих пробелов на один (в цикле пока не кончатся) -учесть наличие (или отсутствие ) пробела после последнего числа - и так далее |
Сп=Новый СписокЗначений; Сп.ТипЗначения=Новый ОписаниеТипов("Число"); ... ... Сп.Всавить(0,СокрЛП(СтрПолучитьСтроку(ПолученнаяСтрока, Сч)); ... ... Сп.Получить(0).Значение >=0 |
// Функция проверяет наличие в строке только цифр // // Параметры // СтрокаПроверки - Строка для проверки только цифр // // Возвращаемое значение: // Булево // Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, УчитыватьЛидирующиеНули = Истина, УчитыватьПробелы = Истина) Экспорт Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда Возврат Ложь; КонецЕсли; Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда Возврат Истина; КонецЕсли; Если НЕ УчитыватьПробелы Тогда СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", ""); КонецЕсли; Если НЕ УчитыватьЛидирующиеНули Тогда НомерПервойЦифры = 0; Для а = 1 По СтрДлина(СтрокаПроверки) Цикл НомерПервойЦифры = НомерПервойЦифры + 1; КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1)); Если КодСимвола <> 48 Тогда Прервать; КонецЕсли; КонецЦикла; СтрокаПроверки = Сред(СтрокаПроверки, НомерПервойЦифры); КонецЕсли; Для а = 1 По СтрДлина(СтрокаПроверки) Цикл КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1)); Если НЕ (КодСимвола >= 48 И КодСимвола <= 57) Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции |
(33) че за бред ? |
34-smaharbA > это из типовой УПП функция |
понял, позырил, ужасна |
//******************************************* Процедура Сформировать() СчетчикНеотрицательныхЧисел = 0; ПроверяемаяСтрока = СтрЗаменить(ИсхСтрока,",","?"); ПроверяемаяСтрока = """" + СтрЗаменить(ПроверяемаяСтрока," ",""",""") + """"; сзПроверяемаяСтрока = СоздатьОбъект("СписокЗначений"); сзПроверяемаяСтрока.ИзСтрокиСРазделителями(ПроверяемаяСтрока); Для сч = 1 по сзПроверяемаяСтрока.РазмерСписка() Цикл ПроверяемаяСтрока = ""; ПроверяемоеЧисло = сзПроверяемаяСтрока.ПолучитьЗначение(сч,ПроверяемаяСтрока); Если Строка(Число(ПроверяемоеЧисло)) = ПроверяемоеЧисло Тогда Если Число(ПроверяемоеЧисло) >= 0 Тогда СчетчикНеотрицательныхЧисел = СчетчикНеотрицательныхЧисел + 1; КонецЕсли; КонецЕсли; КонецЦикла; Сообщить("Количество неотрицательных чисел = " + СчетчикНеотрицательныхЧисел); КонецПроцедуры |
33-Ядрён батон > Мдя... Душераздирающее зрелище. Во-первых, забыт [b]неразрывный пробел[/b]. Что есть смертельных грех, ибо тестирование Строка(2013) вернет Ложь, что [em]какбЕ[/em] странно ;) Во-вторых, на кой ляд вообще "лидирующие нули" (в параметре и модуле), если функция возвращает единственное ИСТИНА/ЛОЖЬ независимо от их наличия? |
37-Зелёный тролль > К тебе это тоже относится ;) |
Текущее время: 07:16. Часовой пояс GMT +3. | [1] [2] |