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" может я конечно не прав, но тогда давай примеры кода/строк для тестирования. | |
25
- 20.08.2013 - 09:29
|
буквы... цифры... автору неотрицательные числа нужны | |
26
- 20.08.2013 - 10:02
| 2(25) если так, то надо взять число пробелов +1 - получаем число "цифровых слов", потом вычитаем чило минусов - получаем число неотрицательных числовых слов. И, разумеется проверка на то, что у нас только числа. | |
27
- 28.08.2013 - 16:52
| Держи: " -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-Зелёный тролль > К тебе это тоже относится ;) | |
| Интернет-форум Краснодарского края и Краснодара |