Проверить, что в строке только цифры #676411


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

В этой группе 1С