1с проверить что в строке только цифры
(1) Цикл по строке с проверкой кода символа, запись цифрового символа в отдельную переменную и преобразование её в число по завершении цикла.
(1) Что-то вроде этого :
Где СтрокаДанных - исходная строка например "as1122ddd3221fff"
МасЧисел - конечный результат (в нашем случае 1122, 3221)
(4) спасибо:) я просто думала, что может быть функция такая, т.к. ничего криминального она не делает
(1) ponaroshku, все верно, потому что такой функции нет :)
Но ее можно написать самому. Для этого нужно пройтись в цикле по каждому символу в строке и проверить, цифра ли это.
Я бы предложил следующий вариант:
user1619761; Apolonov-Erik; malikov_pro; Silver0030; Ujine1313; Nefilimus; Simonov_NPM; aleksdiez; imbaZeratul; zannv; Boulala; AlekSandra29; alexandrmishinn; soulnechnii; x_x; klinval; valafan; App0st0l; vladir; svilsa; Wersia; Chloroform; unknown181538; ponaroshku; + 24 – Ответить
я столкнулся с проблемой когда нужно извлечь все цифры из строки "что-то;типа123 штук". (1) возвращает пустой массив. и код под постом тоже ничего не возвращает((
Но столкнулась с проблемой, если строка вида
12312 много текста 1221. текст "555"
выдает 123121221555 одним числом
в виде нескольких чисел не получить? По примеру - 12312 1221 555
(8) ponaroshku, Вам же hulio в (4) привел как раз нужный вам код, разве что в нем небольшой недочет - нет очистки СтрокаЧисла в цикле, вот поправленный, проверил - работает
(9) прошу прощения
я по (3) делала
(0) а результат "ыдлвапдлцоук234124ывпо341" такой строки какой? ничего против приведенных способов не имею, но я бы использовал регулярные выражения. Например паттерн: \d+
Интересно было бы узнать, какой из методов (программный или метод регулярных выражений) отработает быстрее при больших объемах обработки информации.
В упр. формах можно сделать так.
Результат = 1 524
Если нужно чтобы вывести разные числа из данной строки, то можно немного изменить код
А если Строка типа "12345/15 Какая-то фраза" и нужно получить 12345/15? По всем функциям могу получить только 1234515, а как оставить "/"?
Немного улучшенный вариант с регулярными выражениями - понимает десятичные дроби:
Извините: нашел ошибочку в своей реплике - вот исправленный вариант
Возврат Масс;
КонецФункции // ()
Доброе народ. все вышеуказанные куски кода на какой версии сделаны?? ибо на 8,3 УФ ни один из них не работает(((
10060 (0x0000274C): Попытка установить соединение была безуспешной 19
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем Cодержимое указанного ниже веб-сайта в этом приложении блокируется. Aboutsecurity_1cv8c.exe 1
Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Посмотреть все результаты поиска похожих
Еще в этой же категории
Перевод из Десятичного в Двоичное и обратно 1
При разработке конфигураций, особенно если это обмен с сайтами или старыми системами учета, приходится переводить числа из одной системы исчисления в другую. Ниже примеры кода позволяющие выполнить данные функции перевода Десятичное в Двоичное и Дво Посмотреть все в категории Работа с Числами
СтрЗаменить(СН,"1","");
СтрЗаменить(СН,"2","");
СтрЗаменить(СН,"3","");
СтрЗаменить(СН,"4","");
СтрЗаменить(СН,"5","");
СтрЗаменить(СН,"6","");
СтрЗаменить(СН,"7","");
СтрЗаменить(СН,"8","");
СтрЗаменить(СН,"9","");
СтрЗаменить(СН,"0","");
Возврат СН = "";
Функция ВернутьЦифрыИзСтроки(СтрокаПроверки, УдалитьЛидирующиеНули = Истина)
Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
Возврат "";
КонецЕсли;
Для ё = 1 По СтрДлина(СтрокаПроверки) Цикл
Символ = Сред(СтрокаПроверки, ё, 1);
Если ЭтоЦифра(Символ) Тогда
ЦифрыИзСтроки = ЦифрыИзСтроки + Символ;
КонецЕсли;
КонецЦикла;
Если УдалитьЛидирующиеНули Тогда
ЦифрыИзСтроки = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(ЦифрыИзСтроки, "0");
КонецЕсли;
Функция ЭтоЦифра(Символ)
КодСимвола = КодСимвола(Символ);
Возврат (КодСимвола >= 48 И КодСимвола КонецФункции
(0) не цифры из строки, а только цифры. в общем, пробегание по строке с проверкой каждого символа, понятно
(3) на линукс-сервере не работает
Цель какую преследуешь ?
Попытка
А=Сн*1;
Сообщить("Это число");
Исключение
Сообщить("Это не число");
КонецПопытки;
попытка
времЧисло = Число(исхСтрока);
толькоЧисла = истина;
исключение
толькоЧисла = Ложь;
КонецПопытки;
(5)(6) не правильно работает для А = "1.1"
Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина) Экспорт
Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда
Возврат Истина;
КонецЕсли;
Если НЕ УчитыватьПробелы Тогда
СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", "");
КонецЕсли;
Если НЕ УчитыватьЛидирующиеНули Тогда
НомерПервойЦифры = 0;
Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
НомерПервойЦифры = НомерПервойЦифры + 1;
КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
Если КодСимвола <> 48 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
СтрокаПроверки = Сред(СтрокаПроверки, НомерПервойЦифры);
КонецЕсли;
Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
Если НЕ (КодСимвола >= 48 И КодСимвола Возврат Ложь;
КонецЕсли;
КонецЦикла;
(11) вот именно. а (5) и (6) думает, что да, только цифры. вообще неплохая задача на собеседование для отсеивания 1сников, которые не могут понять задачу
(0)
Возврат Вопрос("В строке """ + СН + """ только цифры?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да;
(0) Если заведомо известно, что строка конечной длины то можно так
Дли=СтрДлина(Стр);
Возврат Стр>=Прав("00000000000000000000000000000000000000000000000",Дли) и Стр
/******************************************************************************
// ВСтрокеОставитьТолькоЦифры(СтрокаИзСимволовИЦифр)
//
// Параметры:
// СтрокаИзСимволовИЦифр (строка) - из которой будут удалены символы, которые не являются десятичными цифрами
//
// Описание:
// Возвращает строку, которая является результатом удаления из строки
//СтрокаИзСимволовИЦифр всех символов, не являющих десятичными цифрами
//
Функция ВСтрокеОставитьТолькоЦифры(СтрокаИзСимволовИЦифр)
Перем Рез;
//Заменяем все символы не цифры на точку, чтобы при выполнении цикла на изменилась длина строки
Для i = 1 По СтрДлина(СтрокаИзСимволовИЦифр) Цикл
СтрокаИзСимволовИЦифр1 = Сред(СтрокаИзСимволовИЦифр, i, 1); //1 символ
Если Найти("0123456789", СтрокаИзСимволовИЦифр1) = 0 Тогда
СтрокаИзСимволовИЦифр = СтрЗаменить(СтрокаИзСимволовИЦифр, СтрокаИзСимволовИЦифр1, ".");
КонецЕсли;
КонецЦикла;
//Удаляем символы, которые являются точкой
Рез = СтрЗаменить(СтрокаИзСимволовИЦифр,".", "");
Возврат Рез;
КонецФункции // ВСтрокеОставитьТолькоЦифры
(29) Слишком много "бы".
Это побеждает.
"Возврат СН = "";"
Ок, всегда буду использовать!
Зн=СокрЛП(К2.Наименование);
ЗнПреобр="";
ДопустСим="+0123456789";//В номерах телефона другого не надо (синхр. с мобилой)
Для п3=1 по СтрДлина(Зн) Цикл
Сим=Сред(Зн,п3,1);
Если Найти(ДопустСим,Сим)>0 Тогда
ЗнПреобр=ЗнПреобр+Сим;
КонецЕсли;
КонецЦикла;
(30) нет, в (0) - пример работающего кода (ну, кроме забытых СН = в строках с СтрЗаменить), выполняющего задачу. Интересно, что даже имея пример многие 1сники не смогли понять, что же требуется.
Интересные варианты есть? Пока побеждает СтрЗаменить(СН,"1",""); СтрЗаменить(СН,"2",""); СтрЗаменить(СН,"3",""); СтрЗаменить(СН,"4",""); СтрЗаменить(СН,"5",""); СтрЗаменить(СН,"6",""); СтрЗаменить(СН,"7",""); СтрЗаменить(СН,"8",""); СтрЗаменить(СН,"9",""); СтрЗаменить(СН,"0",""); Возврат СН = "";
Функция ВернутьЦифрыИзСтроки(СтрокаПроверки, УдалитьЛидирующиеНули = Истина) Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда Возврат ""; КонецЕсли; ЦифрыИзСтроки = ""; Для ё = 1 По СтрДлина(СтрокаПроверки) Цикл Символ = Сред(СтрокаПроверки, ё, 1); Если ЭтоЦифра(Символ) Тогда ЦифрыИзСтроки = ЦифрыИзСтроки + Символ; КонецЕсли; КонецЦикла; Если УдалитьЛидирующиеНули Тогда ЦифрыИзСтроки = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(ЦифрыИзСтроки, "0"); КонецЕсли; Возврат ЦифрыИзСтроки; КонецФункции Функция ЭтоЦифра(Символ) КодСимвола = КодСимвола(Символ); Возврат (КодСимвола >= 48 И КодСимвола
не цифры из строки, а только цифры. в общем, пробегание по строке с проверкой каждого символа, понятно на линукс-сервере не работает
Цель какую преследуешь ? Попытка А=Сн*1; Сообщить("Это число"); Исключение Сообщить("Это не число"); КонецПопытки;
опередили. попытка времЧисло = Число(исхСтрока); толькоЧисла = истина; исключение толькоЧисла = Ложь; КонецПопытки;
Из типовой Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина) Экспорт Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда Возврат Ложь; КонецЕсли; Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда Возврат Истина; КонецЕсли; Если НЕ УчитыватьПробелы Тогда СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", ""); КонецЕсли; Если НЕ УчитыватьЛидирующиеНули Тогда НомерПервойЦифры = 0; Для а = 1 По СтрДлина(СтрокаПроверки) Цикл НомерПервойЦифры = НомерПервойЦифры + 1; КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1)); Если КодСимвола <> 48 Тогда Прервать; КонецЕсли; КонецЦикла; СтрокаПроверки = Сред(СтрокаПроверки, НомерПервойЦифры); КонецЕсли; Для а = 1 По СтрДлина(СтрокаПроверки) Цикл КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1)); Если НЕ (КодСимвола >= 48 И КодСимвола
вот именно. а и думает, что да, только цифры. вообще неплохая задача на собеседование для отсеивания 1сников, которые не могут понять задачу
Возврат Вопрос("В строке """ + СН + """ только цифры?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да;
Если заведомо известно, что строка конечной длины то можно так Дли=СтрДлина(Стр); Возврат Стр>=Прав("00000000000000000000000000000000000000000000000",Дли) и Стр
/****************************************************************************** // ВСтрокеОставитьТолькоЦифры(СтрокаИзСимволовИЦифр) // // Параметры: // СтрокаИзСимволовИЦифр (строка) - из которой будут удалены символы, которые не являются десятичными цифрами // // Описание: // Возвращает строку, которая является результатом удаления из строки //СтрокаИзСимволовИЦифр всех символов, не являющих десятичными цифрами // Функция ВСтрокеОставитьТолькоЦифры(СтрокаИзСимволовИЦифр) Перем Рез; //Заменяем все символы не цифры на точку, чтобы при выполнении цикла на изменилась длина строки Для i = 1 По СтрДлина(СтрокаИзСимволовИЦифр) Цикл СтрокаИзСимволовИЦифр1 = Сред(СтрокаИзСимволовИЦифр, i, 1); //1 символ Если Найти("0123456789", СтрокаИзСимволовИЦифр1) = 0 Тогда СтрокаИзСимволовИЦифр = СтрЗаменить(СтрокаИзСимволовИЦифр, СтрокаИзСимволовИЦифр1, "."); КонецЕсли; КонецЦикла; //Удаляем символы, которые являются точкой Рез = СтрЗаменить(СтрокаИзСимволовИЦифр,".", ""); Возврат Рез; КонецФункции // ВСтрокеОставитьТолькоЦифры
Зн=СокрЛП(К2.Наименование); ЗнПреобр=""; ДопустСим="+0123456789";//В номерах телефона другого не надо (синхр. с мобилой) Для п3=1 по СтрДлина(Зн) Цикл Сим=Сред(Зн,п3,1); Если Найти(ДопустСим,Сим)>0 Тогда ЗнПреобр=ЗнПреобр+Сим; КонецЕсли; КонецЦикла;
нет, в - пример работающего кода (ну, кроме забытых СН = в строках с СтрЗаменить), выполняющего задачу. Интересно, что даже имея пример многие 1сники не смогли понять, что же требуется.
Эээм.. перебираешь символы в строке, заранее создав список из кодов символов цифр, и проверяешь находится ли КодСимвола текущего символа, в списке.
Вроде работает и с действительными числами..Дайте пирожок. штоТам=""; ВвестиСтроку(штоТам); штоТам2= ВРег(штоТам); если штоТам=штоТам2 тогда сообщить("только цифры"); иначе сообщить("есть и буквы"); конецесли;
для каждого символа строки сравнить его на вхождение в интервал от КОдСимв("0") до КодСимв("Z") Только я не помню с ходу, Сначала цифры, потом буквы или наоборот. А так множество латинских букв в таблице кодировки плотное
, ну, главное, что ты меня правильно понял. копилевты, евры, фунты, кавычки и прочая шняга - оем2анси нифига не поменяет - ибо кода -
и что значит - словарь производный? регэксп - очень мощная штука, рекомендую. а вообще там не replace, а match надо использовать, но лень в мануалы лезть.
сложность получается на обычном О(ДлинаСловаря*ДлинаСтроки) Понятное дело, что реплейс из СкриптКонтроля работает таким же перебором, просто низкоуровневым, но на все эти ком-взаимодействия - время много уходит. На 1с, просто рассмотреть чисто алгоритмческую задачу.
просто, регэкспом, например, можно проверить валидность формата емэйла или урла намного более читабельно, чем то же самое на 1с делать. Просто я уверен, что задача далеко не целиком состоит в определении наличия/остутствия каких-то букв - а тут уж регэкспы рулят
я не спорю, проверка валидности строки установленному шаблону - регэксп. Но это из пушки по воробьям в данном случае :) и все же !? :) Идеи? собственно, сам обдумываю хэширование сейчас.
опять же проверять по строке 0[х,Х][0-9,A-F,a-f] (или что-то типа того) легче, чем проверять, является ли первые символы 0x, или 0Х а потом остальную часть.
хм.. собственно придумал :)))))) не экономный к памяти, но зато мы решаем все за один проход. общая схема, кому знакомы плюсы, поймут: кому не понятно, дам каменты. задача решена за время o(длинаМассива)
(25,26) ну да, я просто быстро накидал, на 1с будет почти тоже самое, просто код объемней чутку, а смысл тот же. :))) теперь со спокойной душой можно утвердить, что тема закрыта!? :)
тут смысл не в том, есть массив, или нет, а в том, что индексами этого массива является наш алфавит - в 1с этого нету, в 8 есть соответствие, а из 7.7 подойдет список значений как раз.
Читайте также: