|   |   | 
| 
 | Проверить, что в строке только цифры | ☑ | ||
|---|---|---|---|---|
| 0
    
        Fragster модератор 09.08.13✎ 17:17 | 
        Интересные варианты есть?
 Пока побеждает СтрЗаменить(СН,"1",""); СтрЗаменить(СН,"2",""); СтрЗаменить(СН,"3",""); СтрЗаменить(СН,"4",""); СтрЗаменить(СН,"5",""); СтрЗаменить(СН,"6",""); СтрЗаменить(СН,"7",""); СтрЗаменить(СН,"8",""); СтрЗаменить(СН,"9",""); СтрЗаменить(СН,"0",""); Возврат СН = ""; | |||
| 1
    
        Tatitutu 09.08.13✎ 17:19 | 
        КодСимвола() не ?     | |||
| 2
    
        DexterMorgan 09.08.13✎ 17:20 | 
        Функция ВернутьЦифрыИзСтроки(СтрокаПроверки, УдалитьЛидирующиеНули = Истина)
 Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда Возврат ""; КонецЕсли; ЦифрыИзСтроки = ""; Для ё = 1 По СтрДлина(СтрокаПроверки) Цикл Символ = Сред(СтрокаПроверки, ё, 1); Если ЭтоЦифра(Символ) Тогда ЦифрыИзСтроки = ЦифрыИзСтроки + Символ; КонецЕсли; КонецЦикла; Если УдалитьЛидирующиеНули Тогда ЦифрыИзСтроки = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(ЦифрыИзСтроки, "0"); КонецЕсли; Возврат ЦифрыИзСтроки; КонецФункции Функция ЭтоЦифра(Символ) КодСимвола = КодСимвола(Символ); Возврат (КодСимвола >= 48 И КодСимвола <= 57) КонецФункции | |||
| 3
    
        arsik гуру 09.08.13✎ 17:22 | 
        (0) Регулярные выражения     | |||
| 4
    
        Fragster модератор 09.08.13✎ 17:23 | 
        (0) не цифры из строки, а только цифры. в общем, пробегание по строке с проверкой каждого символа, понятно
 (3) на линукс-сервере не работает | |||
| 5
    
        Tatitutu 09.08.13✎ 17:24 | 
        Цель какую преследуешь ?
 Попытка А=Сн*1; Сообщить("Это число"); Исключение Сообщить("Это не число"); КонецПопытки; | |||
| 6
    
        Торин 09.08.13✎ 17:25 | 
        опередили...
 попытка времЧисло = Число(исхСтрока); толькоЧисла = истина; исключение толькоЧисла = Ложь; КонецПопытки; | |||
| 7
    
        DS 09.08.13✎ 17:27 | 
        (5) Название темы перечитай внимательно.     | |||
| 8
    
        Невский 09.08.13✎ 17:28 | 
        (5) (6) недавно тут много кричали про попытки и про то, что это омнокод     | |||
| 9
    
        Fragster модератор 09.08.13✎ 17:29 | 
        (5)(6) не правильно работает для А = "1.1"
 (8) не, норм | |||
| 10
    
        DexterMorgan 09.08.13✎ 17:30 | 
        (4) СтрЗаменить, лучше проверки всей строки?     | |||
| 11
    
        DS 09.08.13✎ 17:30 | 
        (9) А в строке "1.1" разве только цифры?     | |||
| 12
    
        DexterMorgan 09.08.13✎ 17:31 | 
        (0) Из типовой
 Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина) Экспорт Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда Возврат Ложь; КонецЕсли; Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда Возврат Истина; КонецЕсли; Если НЕ УчитыватьПробелы Тогда СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", ""); КонецЕсли; Если НЕ УчитыватьЛидирующиеНули Тогда НомерПервойЦифры = 0; Для а = 1 По СтрДлина(СтрокаПроверки) Цикл НомерПервойЦифры = НомерПервойЦифры + 1; КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1)); Если КодСимвола <> 48 Тогда Прервать; КонецЕсли; КонецЦикла; СтрокаПроверки = Сред(СтрокаПроверки, НомерПервойЦифры); КонецЕсли; Для а = 1 По СтрДлина(СтрокаПроверки) Цикл КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1)); Если НЕ (КодСимвола >= 48 И КодСимвола <= 57) Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции | |||
| 13
    
        Dimonster 09.08.13✎ 17:32 | 
        (12) Опередил )) СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке (в УПП)     | |||
| 14
    
        DexterMorgan 09.08.13✎ 17:33 | 
        (11) ну так он и пишет, что не правильно (5) и (6) отработает     | |||
| 15
    
        Fragster модератор 09.08.13✎ 17:33 | 
        (11) вот именно. а (5) и (6) думает, что да, только цифры. вообще неплохая задача на собеседование для отсеивания 1сников, которые не могут понять задачу     | |||
| 16
    
        Fenrik 09.08.13✎ 17:33 | 
        (0)
 Возврат Вопрос("В строке """ + СН + """ только цифры?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да; | |||
| 17
    
        Невский 09.08.13✎ 17:35 | 
        (16) )))))))     | |||
| 18
    
        KishMish 09.08.13✎ 17:35 | 
        Возврат Найти(Стр,"1")+Найти("Стр","2")+...+Найти("Стр","0")=0     | |||
| 19
    
        Frost616 09.08.13✎ 17:36 | 
        (16) это победа)))     | |||
| 20
    
        arsik гуру 09.08.13✎ 17:41 | 
        В линуксе какие ни будь компоненты вообще возможно запускать?
 Хоть самонаписанные. | |||
| 21
    
        Живой Ископаемый 09.08.13✎ 17:53 | 
        2(20) это что, похоже на аниме-форум?     | |||
| 22
    
        arsik гуру 09.08.13✎ 17:57 | 
        (21) Я имею ввиду внутри сервера приложений.     | |||
| 23
    
        Fragster модератор 09.08.13✎ 17:58 | 
        (20) можно     | |||
| 24
    
        arsik гуру 09.08.13✎ 18:08 | 
        (23) а примерчики есть?     | |||
| 25
    
        Fragster модератор 09.08.13✎ 18:13 | ||||
| 26
    
        KishMish 09.08.13✎ 19:01 | 
        (0) Если заведомо известно, что строка конечной длины то можно так
 Дли=СтрДлина(Стр); Возврат Стр>=Прав("00000000000000000000000000000000000000000000000",Дли) и Стр<=Прав("9999999999999999999999999999999999999999999",Дли); | |||
| 27
    
        KishMish 09.08.13✎ 19:04 | 
        (26) а нет, пардон     | |||
| 28
    
        NikVars 09.08.13✎ 20:53 | 
        /******************************************************************************
 // ВСтрокеОставитьТолькоЦифры(СтрокаИзСимволовИЦифр) // // Параметры: // СтрокаИзСимволовИЦифр (строка) - из которой будут удалены символы, которые не являются десятичными цифрами // // Описание: // Возвращает строку, которая является результатом удаления из строки //СтрокаИзСимволовИЦифр всех символов, не являющих десятичными цифрами // Функция ВСтрокеОставитьТолькоЦифры(СтрокаИзСимволовИЦифр) Перем Рез; //Заменяем все символы не цифры на точку, чтобы при выполнении цикла на изменилась длина строки Для i = 1 По СтрДлина(СтрокаИзСимволовИЦифр) Цикл СтрокаИзСимволовИЦифр1 = Сред(СтрокаИзСимволовИЦифр, i, 1); //1 символ Если Найти("0123456789", СтрокаИзСимволовИЦифр1) = 0 Тогда СтрокаИзСимволовИЦифр = СтрЗаменить(СтрокаИзСимволовИЦифр, СтрокаИзСимволовИЦифр1, "."); КонецЕсли; КонецЦикла; //Удаляем символы, которые являются точкой Рез = СтрЗаменить(СтрокаИзСимволовИЦифр,".", ""); Возврат Рез; КонецФункции // ВСтрокеОставитьТолькоЦифры | |||
| 29
    
        Fragster модератор 09.08.13✎ 20:59 | 
        (28) если бы это было собеседование, ты бы его не прошел     | |||
| 30
    
        NikVars 09.08.13✎ 21:03 | 
        (29) Слишком много "бы"...
 Это побеждает??????? "Возврат СН = "";" Ок, всегда буду использовать! | |||
| 31
    
        Vovik 09.08.13✎ 21:05 | 
        Зн=СокрЛП(К2.Наименование);
 ЗнПреобр=""; ДопустСим="+0123456789";//В номерах телефона другого не надо (синхр. с мобилой) Для п3=1 по СтрДлина(Зн) Цикл Сим=Сред(Зн,п3,1); Если Найти(ДопустСим,Сим)>0 Тогда ЗнПреобр=ЗнПреобр+Сим; КонецЕсли; КонецЦикла; | |||
| 32
    
        Fragster модератор 09.08.13✎ 21:07 | 
        (30) нет, в (0) - пример работающего кода (ну, кроме забытых СН = в строках с СтрЗаменить), выполняющего задачу. Интересно, что даже имея пример многие 1сники не смогли понять, что же требуется.     | |||
| 33
    
        Vovik 09.08.13✎ 21:10 | 
        В (0) нет присвоения. сн=саменить(СН...)     | |||
| 34
    
        Fragster модератор 09.08.13✎ 21:11 | 
        (33) прочитал (32) в скобках? без присвоения оно, кстати, не проходит синтаксический контроль.     | |||
| 35
    
        NikVars 09.08.13✎ 21:12 | 
        (32) Так что же требуется - разжуй.     | |||
| 36
    
        CepeLLlka 09.08.13✎ 21:13 | 
        У меня первым делом пришла мысль про код символа..     | |||
| 37
    
        Vovik 09.08.13✎ 21:14 | 
        (36)А если код а не мысли. Не понял что за идея с код символа?     | |||
| 38
    
        Vovik 09.08.13✎ 21:16 | 
        Можно сравнить еще как то извратнее:
 СтрДлина(Число("5ап1а1")) = 1 СтрДлина("5ап1а1") = 6 (7.7) | |||
| 39
    
        CepeLLlka 09.08.13✎ 21:22 | 
        (36)Эээм.. перебираешь символы в строке, заранее создав список из кодов символов цифр, и проверяешь находится ли КодСимвола() текущего символа, в списке.     | |||
| 40
    
        sirsp 09.08.13✎ 21:23 | 
        Ставлю на перебор через Символ(КодСимвола(...)) и поиск в строке "0123456789."     | |||
| 41
    
        Vovik 09.08.13✎ 21:25 | 
        (39)(40) я не понял зачем код символа? Если проще сразу брать символ? Что это дает?     | |||
| 42
    
        Мария Елена 09.08.13✎ 21:27 | 
        Возврат СтрДлина(Тест) = СтрДлина(Число(Тест))     | |||
| 43
    
        sirsp 09.08.13✎ 21:27 | 
        хз, привычка из других ЯП ;)     | |||
| 44
    
        Vovik 09.08.13✎ 21:27 | 
        (42)Еще на "0" условие надо     | |||
| 45
    
        CepeLLlka 09.08.13✎ 21:29 | 
        (41)Ну браток.. мы видимо просто не такие крутые как ты ещё.. вот и всё..     | |||
| 46
    
        NikVars 09.08.13✎ 21:30 | 
        +(44) На первый ноль.     | |||
| 47
    
        NikVars 09.08.13✎ 21:30 | 
        +(44) На первые два нуля...     | |||
| 48
    
        Vovik 09.08.13✎ 21:31 | 
        (45)Фух.. славо богу. А то я подумал что я слишком туп:)     | |||
| 49
    
        miron25 09.08.13✎ 21:34 | 
        Вроде работает и с действительными числами..Дайте пирожок.
 штоТам=""; ВвестиСтроку(штоТам); штоТам2= ВРег(штоТам); если штоТам=штоТам2 тогда сообщить("только цифры"); иначе сообщить("есть и буквы"); конецесли; | |||
| 50
    
        NikVars 09.08.13✎ 21:36 | 
        (49) А если введу только большие буквы?     | |||
| 51
    
        Vovik 09.08.13✎ 21:36 | 
        (49)Не катит. Много исключений в виде точек, запятых, знаков доллара и т.п. кракозябр.     | |||
| 52
    
        miron25 09.08.13✎ 21:37 | 
        (51)Логично..Надо думать.     | |||
| 53
    
        Mnemonic1C 09.08.13✎ 21:41 | 
        Часто регулярные выражения используются для тестирования строк, например пользовательского ввода. 
 Этот пример позволяет узнать, является ли строка целым числом. Код 1C v 7.x /////////////////////////////////////////////////////////////////////// //Проверка подстроки Процедура RegExp_Test() RegExp = CreateObject("VBScript.RegExp"); RegExp.Pattern = "^\d+$"; //Шаблон, который соответствует целому числу стр="12345";//Строка, которую тестируем Если RegExp.Test(стр)=0 Тогда Сообщить("Это не целое число"); Иначе Сообщить("Это целое число"); КонецЕсли; //Выдаст в окно сообщений: //"Это целое число" КонецПроцедуры | |||
| 54
    
        Mnemonic1C 09.08.13✎ 21:41 | ||||
| 55
    
        КонецЦикла 09.08.13✎ 21:43 | 
        Вот такое когда-то придумал, помогает. Правда для 7.7
 http://1c911.by/stati_1s/statya-poleznye-melochi.htm#4 | |||
| 56
    
        Fragster модератор 09.08.13✎ 21:57 | 
        (35) требуется ровно то, что в сабже: "Проверить, что в строке только цифры". результат проверки - да или нет     | |||
| 57
    
        Torquader 09.08.13✎ 22:06 | 
        Интересный вопрос, а строка "" - это строка, содержащая только цифры или нет ?     | |||
| 58
    
        sirsp 09.08.13✎ 22:12 | 
        (57) +10050
 ЗЫ ИМХО удобно, когда нормальный парсер типа Число(Строка) в таких случаях возвращает 0 | |||
| 59
    
        banco 09.08.13✎ 22:15 | 
        Возврат СтрДлина(СН) = 
 (СтрЧислоВхождений(СН, "0") + СтрЧислоВхождений(СН, "1") + СтрЧислоВхождений(СН, "2") + СтрЧислоВхождений(СН, "3") + СтрЧислоВхождений(СН, "4") + СтрЧислоВхождений(СН, "5") + СтрЧислоВхождений(СН, "6") + СтрЧислоВхождений(СН, "7") + СтрЧислоВхождений(СН, "9") ) | |||
| 60
    
        Fragster модератор 09.08.13✎ 22:33 | 
        (57) вопрос и правда интересный. будем считать, что да, тем более, что имеющийся в (0) код тоже так считает.     | |||
| 61
    
        КонецЦикла 09.08.13✎ 22:45 | 
        (60) Хм... а с чего бы "" являлось числом? Какие предпосылки? Твоя штука может и ошибаться...     | |||
| 62
    
        Fragster гуру 09.08.13✎ 23:34 | 
        (61) числа и цифры - видишь разницу?     | |||
| 63
    
        GedKo 09.08.13✎ 23:39 | 
        Очередная попытка выпендриться, не выдан полное задание.
 зы. VI - число? а FFFF? | |||
| 64
    
        Torquader 09.08.13✎ 23:49 | 
        (60) Просто тогда метод
 Если Строка(Число(ПроверяемаяСтрока))=ПроверяемаяСтрока Тогда ЭтоЧисло=Да; Но, 001 - это числовая строка, а не число, а 1.1 - число, но не строка из цифр. | |||
| 65
    
        Fragster гуру 09.08.13✎ 23:55 | 
        (64) сколько раз нужно повторить 1снику, что нужна проверка на то, что строка содержит только цифры, чтобы он это понял?     | |||
| 66
    
        Karavanych 10.08.13✎ 04:33 | 
        мне не нравится код в (0) тем что сложность метода = число символов*10;
 (65) много, потому что 1с ники обычно решают практические задачи, и не любят теоретические :) | |||
| 67
    
        John D 10.08.13✎ 05:29 | 
        А почему нельзя по-простому: ехать от начала к концу и, как только текущий символ НЕ цифры - сразу возвращать ЛОЖЬ, а, если доехал до конца - ИСТИНУ? Проще-то некуда, вроде.     | |||
| 68
    
        Prilepsky 10.08.13✎ 06:30 | 
        А можно вообще извратиться и сделать проверку через запрос :) 
 ТолькоЦифры = Истина; КС = Новый КвалификаторыСтроки(); Массив = Новый Массив; Массив.Добавить(Тип("Строка")); ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС); ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Наименование",ОписаниеТиповС,"Наименование"); СтрокаТЗ = Тз.Добавить(); СтрокаТЗ.Наименование = СН; КоличествоСимволов = СтрДлина(СН); Подобие = ""; Для Н = 1 По КоличествоСимволов Цикл Подобие = Подобие + "[0-9]"; КонецЦикла; Запрос = Новый Запрос("ВЫБРАТЬ | ИСТИНА КАК ТолькоЦифры |ПОМЕСТИТЬ времТаб |ИЗ | &ТЗ КАК ТЗ |ГДЕ | ТЗ.Наименование ПОДОБНО &Подобие |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Т.ТолькоЦифры |ИЗ | времТаб КАК Т"); Запрос.УстановитьПараметр("ТЗ", ТЗ); Запрос.УстановитьПараметр("Подобие", Подобие); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда ТолькоЦифры = Ложь; КонецЕсли; Сообщить(ТолькоЦифры); | |||
| 69
    
        arsik гуру 10.08.13✎ 09:27 | 
        Вот такой вариант. Для ускорения лучше "Цифры = "0123456789";" вынести из функции
 
 | |||
| 70
    
        DJ Anthon 10.08.13✎ 09:35 | 
        (59) а 8?     | |||
| 71
    
        DJ Anthon 10.08.13✎ 09:37 | 
        (58) не нравится - используй Число("0" + СокрЛП()). просто там вообще все, что угодно может оказаться. защиту от дурака еще никто не отменял.     | |||
| 72
    
        arsik гуру 10.08.13✎ 09:41 | 
        +(69) ну и надо тестировать на реальных данных. Допустим в (69) если нечисло будет в начале строки, то будет быстрее     | |||
| 73
    
        Zero on a dice 10.08.13✎ 10:16 | 
        если в (6) добавить сравнение с округленным результатом, имхо, будет самый быстрый код из стандартных 1С-овых     | |||
| 74
    
        DS 10.08.13✎ 10:21 | 
        (62) По сути - не прав.
 "Присутствие только цифр" <> "Отсутствие не-цифр" как раз из-за пустой строки. | |||
| 75
    
        Torquader 10.08.13✎ 23:47 | 
        (69) А есть уверенность, что Найти("0123456789",Символ) будет работать быстрее, чем (Код>=48)И(Код<=57) ?     | |||
| 76
    
        Torquader 10.08.13✎ 23:48 | 
        + В восьмёрке же КодСимв(Строка,Позиция) позволяет не получать символ из строки, а сразу получить его код.     | |||
| 77
    
        arsik гуру 11.08.13✎ 16:50 | 
        (76) Проверил. результат примерно одинаковый. на 1000000 расхождения +- 10 %     | |||
| 78
    
        Torquader 11.08.13✎ 19:49 | 
        (77) Видимо, в 1С сравнение чисел выполняется в несколько этапов - сначала сравнение типов, а потом только сравнение данных.     | |||
| 79
    
        singlych 14.08.13✎ 18:10 | 
        Попытка 
 Ответ = НЕ (Найти(СтрокаДляПроверки, ".") ИЛИ Найти(СтрокаДляПроверки, ",") ИЛИ "1" + СтрокаДляПроверки <> Формат(Число("1" + СтрокаДляПроверки), "ЧГ=")); Исключение Ответ = Ложь; КонецПопытки; | |||
| 80
    
        giallo 14.08.13✎ 18:22 | 
        (0)
 ВЫБРАТЬ ВЫБОР КОГДА &СН ПОДОБНО "%[^0-9]%" ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ КАК ВСтрокеТолькоЦифры | |||
| 81
    
        Fragster модератор 14.08.13✎ 18:36 | 
        (80) различное поведение в части пустой строки, но в принципе неплохо     | |||
| 82
    
        НаборДанных 14.08.13✎ 18:42 | 
        Подпишусь, позже почитаю.     | |||
| 83
    
        giallo 14.08.13✎ 18:43 | 
        (81) да вроде такое же, если СН = "" будет Истина     | |||
| 84
    
        Fragster модератор 14.08.13✎ 18:47 | 
        (83) согласен, протупил     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |