1с проверить что в строке только цифры

Обновлено: 03.07.2024

Интересные варианты есть? Пока побеждает СтрЗаменить(СН,"1",""); СтрЗаменить(СН,"2",""); СтрЗаменить(СН,"3",""); СтрЗаменить(СН,"4",""); СтрЗаменить(СН,"5",""); СтрЗаменить(СН,"6",""); СтрЗаменить(СН,"7",""); СтрЗаменить(СН,"8",""); СтрЗаменить(СН,"9",""); СтрЗаменить(СН,"0",""); Возврат СН = "";

Функция ВернутьЦифрыИзСтроки(СтрокаПроверки, УдалитьЛидирующиеНули = Истина) Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда Возврат ""; КонецЕсли; ЦифрыИзСтроки = ""; Для ё = 1 По СтрДлина(СтрокаПроверки) Цикл Символ = Сред(СтрокаПроверки, ё, 1); Если ЭтоЦифра(Символ) Тогда ЦифрыИзСтроки = ЦифрыИзСтроки + Символ; КонецЕсли; КонецЦикла; Если УдалитьЛидирующиеНули Тогда ЦифрыИзСтроки = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(ЦифрыИзСтроки, "0"); КонецЕсли; Возврат ЦифрыИзСтроки; КонецФункции Функция ЭтоЦифра(Символ) КодСимвола = КодСимвола(Символ); Возврат (КодСимвола >= 48 И КодСимвола <= 57) КонецФункции

не цифры из строки, а только цифры. в общем, пробегание по строке с проверкой каждого символа, понятно на линукс-сервере не работает

Цель какую преследуешь ? Попытка А=Сн*1; Сообщить("Это число"); Исключение Сообщить("Это не число"); КонецПопытки;

опередили. попытка времЧисло = Число(исхСтрока); толькоЧисла = истина; исключение толькоЧисла = Ложь; КонецПопытки;

недавно тут много кричали про попытки и про то, что это омнокод

Из типовой Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина) Экспорт Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда Возврат Ложь; КонецЕсли; Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда Возврат Истина; КонецЕсли; Если НЕ УчитыватьПробелы Тогда СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", ""); КонецЕсли; Если НЕ УчитыватьЛидирующиеНули Тогда НомерПервойЦифры = 0; Для а = 1 По СтрДлина(СтрокаПроверки) Цикл НомерПервойЦифры = НомерПервойЦифры + 1; КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1)); Если КодСимвола <> 48 Тогда Прервать; КонецЕсли; КонецЦикла; СтрокаПроверки = Сред(СтрокаПроверки, НомерПервойЦифры); КонецЕсли; Для а = 1 По СтрДлина(СтрокаПроверки) Цикл КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1)); Если НЕ (КодСимвола >= 48 И КодСимвола <= 57) Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции

Опередил )) СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке (в УПП)

вот именно. а и думает, что да, только цифры. вообще неплохая задача на собеседование для отсеивания 1сников, которые не могут понять задачу

Возврат Вопрос("В строке """ + СН + """ только цифры?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да;

В линуксе какие ни будь компоненты вообще возможно запускать? Хоть самонаписанные.

Если заведомо известно, что строка конечной длины то можно так Дли=СтрДлина(Стр); Возврат Стр>=Прав("00000000000000000000000000000000000000000000000",Дли) и Стр<=Прав("9999999999999999999999999999999999999999999",Дли);

/****************************************************************************** // ВСтрокеОставитьТолькоЦифры(СтрокаИзСимволовИЦифр) // // Параметры: // СтрокаИзСимволовИЦифр (строка) - из которой будут удалены символы, которые не являются десятичными цифрами // // Описание: // Возвращает строку, которая является результатом удаления из строки //СтрокаИзСимволовИЦифр всех символов, не являющих десятичными цифрами // Функция ВСтрокеОставитьТолькоЦифры(СтрокаИзСимволовИЦифр) Перем Рез; //Заменяем все символы не цифры на точку, чтобы при выполнении цикла на изменилась длина строки Для i = 1 По СтрДлина(СтрокаИзСимволовИЦифр) Цикл СтрокаИзСимволовИЦифр1 = Сред(СтрокаИзСимволовИЦифр, i, 1); //1 символ Если Найти("0123456789", СтрокаИзСимволовИЦифр1) = 0 Тогда СтрокаИзСимволовИЦифр = СтрЗаменить(СтрокаИзСимволовИЦифр, СтрокаИзСимволовИЦифр1, "."); КонецЕсли; КонецЦикла; //Удаляем символы, которые являются точкой Рез = СтрЗаменить(СтрокаИзСимволовИЦифр,".", ""); Возврат Рез; КонецФункции // ВСтрокеОставитьТолькоЦифры

если бы это было собеседование, ты бы его не прошел

Слишком много "бы". Это побеждает. "Возврат СН = "";" Ок, всегда буду использовать!

Зн=СокрЛП(К2.Наименование); ЗнПреобр=""; ДопустСим="+0123456789";//В номерах телефона другого не надо (синхр. с мобилой) Для п3=1 по СтрДлина(Зн) Цикл Сим=Сред(Зн,п3,1); Если Найти(ДопустСим,Сим)>0 Тогда ЗнПреобр=ЗнПреобр+Сим; КонецЕсли; КонецЦикла;

нет, в - пример работающего кода (ну, кроме забытых СН = в строках с СтрЗаменить), выполняющего задачу. Интересно, что даже имея пример многие 1сники не смогли понять, что же требуется.

прочитал в скобках? без присвоения оно, кстати, не проходит синтаксический контроль.

А если код а не мысли. Не понял что за идея с код символа?

Можно сравнить еще как то извратнее: СтрДлина(Число("5ап1а1")) = 1 СтрДлина("5ап1а1") = 6 (7.7)

Эээм.. перебираешь символы в строке, заранее создав список из кодов символов цифр, и проверяешь находится ли КодСимвола текущего символа, в списке.

Ставлю на перебор через Символ(КодСимвола(. )) и поиск в строке "0123456789."

я не понял зачем код символа? Если проще сразу брать символ? Что это дает?

Ну браток.. мы видимо просто не такие крутые как ты ещё.. вот и всё..

Вроде работает и с действительными числами..Дайте пирожок. штоТам=""; ВвестиСтроку(штоТам); штоТам2= ВРег(штоТам); если штоТам=штоТам2 тогда сообщить("только цифры"); иначе сообщить("есть и буквы"); конецесли;

Не катит. Много исключений в виде точек, запятых, знаков доллара и т.п. кракозябр.

Дано: много строк (>10000), длина каждой < 40 символов, могут содержать любые алфавитно-цифровые символы, точки и запятые.
Задача: нужно максимально быстро определить, является ли эта строка числом. При этом строка, являющаяся числом, может содержать нули в старших разрядах и нули на хвосте дробной части. Разделителем разрядов может быть как точка, так и запятая. Знака изначально в строке быть не может, поэтому на + и - пофиг.
Например числа:
0100,99900
100
100.99
Не числа:
100.0,12
Asd100xЩ
100.0Ю
Предложите быстрый алгоритм, плз?

умножить на любое число, например 1. если ругнётся - не число.
Попытка, Исключение

(1) Не. Стр*1 - Операция умножения не определена для строковых величин, 1*Стр - умножит всегда, преобразовав по правилам Число()

Если б не нули в начале и конце, прокатило бы:
.
с предварительной заменой запятой на точку. А с нулями - хз.
Очень не хочется посимвольно разбирать строку, ибо много их.

(6) п. 1 - я сходу вижу только посимвольным разбором. Чего как-раз и не хочется. Как быстро нули посчитать?
(7) Игра ума. Лучше алгоритм предложи. Быстрый.
(8) Потому что Число("123") - это число. А число не равно строке. Засунь в конфигуратор - увидишь.

(10) Это написано в (3). Для строки "0100" условие не выполняется. Я ж говорю - проблема в нулях.

(12)не взлетит
(11) без посимвольного не обойтись, на этапе отсечения нулей - перебор будет короче всего

(12) Повезло тебе, что не на китайском пишешь. У них там, грят, около 5000 основных иероглифов. У какая длинная строка с Найти() была бы ;)

если (3) катит с предварительной заменой точек и запятых.
то замени в исходной строке Стр все "0" на любую другую цифирь

(0) а в принципе, как такая задача родилась?
Тест что ли какой-то?

(18) скорее всего автор хочет привести все Наименования какого-то Справочника к числовому виду

(19)Скорее, коды. Когда нарушают уникальность, потом начинают вводить всякую чепуху.

(20) м.б. автор хочет производить какие-то матоперации с наименованиями.
м.б. это лотерейные билеты или номера скидочных карточек покупателя.
(21) коды я отмёл сразу - (22) прав. самое бОлшее я видел 15 знаков кода.

(22) хотя да.
(23) жизни вы не видели, я видела 100:) Они туда закодировали производителя, иерархию и пр.

(24) Боже!
а зачем же так код мучать? реквизит в Справочник нельзя добавить?

(23) На мой взгляд, для решения этой задачи, надо знать полностью условие, потому как от условий возможна разная реализация, сама по себе задача решаема в лоб без всяких проблем, если она единовременная, то можно плюнуть на быстродействие. Допустим, если автор действительно хочет "перекодировать" справочник, то нужен дополнительный алгоритм, потому как при использовании одного алгоритма преобразования строки состоящей из одних цифр или из цифр и каких-то символов в число, может "задвоится" число, т.е. при одинаковом преобразовании строки цифр и строки символов имеем вероятность получить на выходе одно и то же число.

(28) логично. об уникальности я не подумал.
0099.9, 099.9, 99.990 дадут одно число 99.9

Если нужно просто "достать число" - то есть очень простой способ извлечения числа из строки, без перебора.

ре.test(вСтрока)
В точности не уверен, можно потестировать если надо.

(42) Я понял, что нужно еще определить само значение если строка является числом.

(45) :-)
0 будет только если проверяемое выражение начинается не с цифры. А все первые цифры буду превращаться в число, остальное отбрасываться.

(53) Ограничение знаков после запятой. Для 1С это не число

В терминах поставленной задачи эта строка - число, со значением в 1С, равным нулю.

"1.00000000000000000001" - числом.
Потому как все попытки сравнивать строки до и после преобразования функцией "Число", натыкаются на ограниченность разрядов.

(57) можно и не определяться, по такому принципоу пойти
Число("1"+".000000000000000000001"+"1")*10000000000000000000000

(58) не фигня, так многое можно определить и не только строка или число

(59)
Число("1"+"9876543210"+"1")*1000000000000000000000000000000000000000 =
198765432101000000000000000000000000000000000000000

(58)(59) а это - Число("1толиДатолиНет"+".000000000000000000001"+"1")*10000000000000000000000 число ?

(61) Не, ну понятно. Я сказал что принцып такой. Позицию разделителя дробной найти.

(53) Как я понял, 1С не видит больше 20 знаков после точки.
Тогда можно извернуться так.
Часть вторая.усовершенствованная :-):
--------------------

Ну, ладно, это я уже стебаюсь.
Имхо можно эти способы объединить или выбрать более удобный для (0).

КодСимв(<?>)
Синтаксис:
КодСимв(<Символ>)
Назначение:
Возвращает код первого символа, содержащегося в строке.
Параметры:
<Символ> - строковое выражение.

(67)
То и вернет, что строка является числом, и его значение.
Фишка в том, что число в 1С ограниченно 69 разрядами (чего хватает для этой задачи), но при преобразовании его в строку обрезает до 23 знаков после запятой.

(66)
Неправильно отработает, если будет две точки, и они попадут в разные части.
Либо в середине строки будут пробелы, которые попадут в первую часть в конец, во вторую часть в начало.

(71) Легко решается несколькими строками в начале процедуры Сформировать
:-)

не всеже объясните тупым и алкоголикам чем шаблон плох ? медленно ?

(75) Только еще одно уловие поставить надо, если нет дробной части. Просто хотелось не перебором.
(74) Ну чего ты этими шаблонами добьешься? Попробуй че нить подсунуть. К примеру 00А00.5115.1

(76) Не надо доп. условий, там в комментарии пояснено, почему не надо. И перебора там нет - СтрЗаменить-то без перебора работает.
(78) Спортивно средствами встроенного языка.

такое чувство, что из предложенных вриантов не все тестировали (больше писали на угад) + кто скажет что быстрее ? :)
П.С. сам пока думаю. :)

Мда. Не ожидал я такого спортивного интереса, когда тему поднимал :)
Сразу повторю свой ответ на вопрос "а на хрена?" - это действительно игра ума :) Была реальная, но разовая задача, сделал ее "в лоб" перебором, потом стало интересно, а как быстрее, поставил граничные условия, запостил сюда, пошел домой спать :)
Самый быстрый вариант, как ни странно, оказался самым первым, у 2Green. Но он не работает с числами >20 знаков. Результат меня сильно удивил, потому как я думал о первом варианте Рэйва.
Замер производительности показал:
(В тиках - 110 и 117 соответственно)
Дальше идет вариант с регулярными выражениями (154 тика), вариант orefkov'а (187 тиков), вариант Пуделя (551 тик). Остальные варианты пока не померил.

(84) с регулярами заметь, можно весь тект за один присест, не построчно, "рассортировать".

(84) Блин, ты просто моё время с временем Сообщить замерял :))). Я только что проверил - у меня быстрее орефкова (моё 0.004647, орефкова 0.004695)

(84) Попробуй вариант для регулярных не по одной строке, а по "тексту" т.е. строке разделенной "РазделительСтрок". Если конечно в условия задачи вползает.

Да с Шаблон медленно когда не число зато код простой, можна и еще просче :)
.

(88) Не-а. Правда твой код я переписал, оставил только идею:
(87) Надо "тестовый стенд" для этого переписывать. Сейчас он выглядит так:
1. Исходные данные живут в дбф. 10000 строк. Строки формировались так:
1.1. Случайная длина строки от 1 до 40
1.2. Каждый символ строки генерировался случайным образом из набора "01234567890.,AB". Такой набор получил опытным путем - меня устроил процент "правильных" чисел:

15% (точнее - 1360 из 10000)
1.3. Массив строк хранится в глобальной переменной и перед началом работы считывается из dbf
2. Все алгоритмы загонялись в функцию, возвращающую количество чисел в наборе. Шаблон функции:

(84) ну, с учётом что исходные строки длиной <40, и что ограничение на дробную часть в 20 знаков.
можно добавить Лев(Стр,20) и Прав(Стр,20)

для каждого символа строки сравнить его на вхождение в интервал от КОдСимв("0") до КодСимв("Z") Только я не помню с ходу, Сначала цифры, потом буквы или наоборот. А так множество латинских букв в таблице кодировки плотное

нет ничего проще : ЗЫ: Можешь проверять и посимвольно.

а непечатные символы в диапазоне до 127 символа не учтены!

сам всегда пользую , но как-то пошло это.. не находите!?

, ну, главное, что ты меня правильно понял. копилевты, евры, фунты, кавычки и прочая шняга - оем2анси нифига не поменяет - ибо кода - <= 127 :)

а смысл остался тот же, тем более еще и медленнее. а если у нас, допустим, словарь произвольный?

ни фига не медленнее - нету цикла с 26+26+10 итерациями

и что значит - словарь производный? регэксп - очень мощная штука, рекомендую. а вообще там не replace, а match надо использовать, но лень в мануалы лезть.

Кстати как раз я на самом деле под WEB пишу на АСП и 1С77. поэтому такие вопросы и пошли )

сложность получается на обычном О(ДлинаСловаря*ДлинаСтроки) Понятное дело, что реплейс из СкриптКонтроля работает таким же перебором, просто низкоуровневым, но на все эти ком-взаимодействия - время много уходит. На 1с, просто рассмотреть чисто алгоритмческую задачу.

словарь произвольный(!), например: словарь hex символов "01234567890xabcdefXABCDEF"

просто, регэкспом, например, можно проверить валидность формата емэйла или урла намного более читабельно, чем то же самое на 1с делать. Просто я уверен, что задача далеко не целиком состоит в определении наличия/остутствия каких-то букв - а тут уж регэкспы рулят

я не спорю, проверка валидности строки установленному шаблону - регэксп. Но это из пушки по воробьям в данном случае :) и все же !? :) Идеи? собственно, сам обдумываю хэширование сейчас.

опять же проверять по строке 0[х,Х][0-9,A-F,a-f] (или что-то типа того) легче, чем проверять, является ли первые символы 0x, или 0Х а потом остальную часть.

хм.. собственно придумал :)))))) не экономный к памяти, но зато мы решаем все за один проход. общая схема, кому знакомы плюсы, поймут: кому не понятно, дам каменты. задача решена за время o(длинаМассива)

(25,26) ну да, я просто быстро накидал, на 1с будет почти тоже самое, просто код объемней чутку, а смысл тот же. :))) теперь со спокойной душой можно утвердить, что тема закрыта!? :)

если 8ка, то там есть объект Массив, так что и без списков обойдемся :)

ууууууупц :))))))) "как это было давно. " Просто переклино, что в 8ке он отдельным объектом выделен.

тут смысл не в том, есть массив, или нет, а в том, что индексами этого массива является наш алфавит - в 1с этого нету, в 8 есть соответствие, а из 7.7 подойдет список значений как раз.

Добавлено через 16 минут
Как это часто бывает, стоило задать вопрос на форуме, тут же доходит где ошибся.
Не надо в шаблон вставлять исходную строку и слэш / нужен в ява-скрипт (пример брал оттуда), в 1с без него
Вопрос закрыт.

Добавлено через 2 часа 46 минут
Если кто-то заинтересуется. Код для проверки, что в строке только цифры:

Если в Исходной строке только цифры, возвращает 1, иначе - 0. Работает быстро и код короткий ))

Регулярные выражения. Выделить только цифры кроме букв и (_) до и после
Здравствуйте! Подскажите, пожалуйста, как правильно составить регулярное выражение, чтобы.

Регулярные выражения. Оставить в строке только буквы и цыфры
Здравствуйте. Помогите, пожалуйста, решить проблему. В строке нужно оставить только латинские буквы.

Регулярные выражения. Требуется оставить в строке только буквы
Требуется оставить в строке только буквы, вариант решения такой: Re = /()/g; S =.

Добавлено через 8 минут
регэксп крутая штука, но с этими паттернами умрешь разбираться)))

Dethmontt, С крутизной согласен. Почитал форум по регэксп, есть мастера творящие просто чудеса. А вот с вашим решением по "только цифры" не согласен. Такой код, например, строку "10 негритят" вернет как истина, хотя в строке не только цифры. Как понял: /d
Цифры, + до конца строки. Для НЕ многострочного текста подойдет ^/d+ (с начала сроки по ее конец цифры). А учесть возможность многострочности - $

Добавлено через 4 минуты
Неправильный пример. Правильно "негритят 10"

фридл. очень советую.
до сих пор где-то лежит на винте. максимально полезная. и простая угу. удивлён. наверно не та версия.
я вроде читал было страниц под двести. а тут 600.
но всё равно без практики теряется. а иногда и мысль в голову не придёт, что тут она нужна.
п.с. регэкспа. Yulunga, Нашел бесплатную версию. Читается как бестселлер. Прочитав две главы понял, что ни черта не понимал в рег выражениях, даже в том что получилось сделать.
Так же понял, что сделанное надо бы переделать (приведение адреса клиента из произвольной формы ЕГРЮЛ к формату ФИАС), будет и понятней и короче и быстрей.
Так что реально огромное спасибо. Продолжу изучение polax, так-то оно не очень сильное применение, но раз годика в два можно освежать под футбол. будет полезно. можно начать видеть интересное в обыденности ) Так, как их расхваливают, тоже решил попробовать. Подскажите как в строке оставить только буквы и цифры?)

_ЕГОР_, Должно быть так (за одно и проверим ))) )
^(/d*[а-яА-Я]* *)$
^ - с начала строки
/d - цифры
* - может быть от одного знака до любого количества, но может и не быть ни одного (действует к символу перед ним, в примере - это цифры
[а-яА-Я] - все буквы русского алфавита строчные и прописные
* - то же, но стоит после букв, действует для букв
пробел - в строке могут быть пробелы
* - то же, но стоит после пробела, действует для пробела
$ - конец строки
Читается примерно так:
Сначала и до конца строки могут быть цифры или любые буквы от ни одного до любого количества знаков, так же в строке могут быть (а могут и не быть) пробелы.
Такое написание не пропустит ни одного знака препинания, спец знаки, кавычки. английские буквы и т.п. Если что-то из этого разрешено. нужно дополнительно включить в квадратных скобках. Что-то типа
[а-яА-Я.,]

Добавлено через 19 минут
_ЕГОР_, Написал и понял, что спрашивают о другом ))) Удалить из строки все кроме букв и цифр. Так, наверное, задача стоит?

Ищем все знаки в строке отличные от цифр, букв русского и английского алфавитов и пробелов. И меняем все найденные значения на пробел.

Добавлено через 1 минуту
Все можно сделать и кодом 1с, но насколько изящнее и короче выглядит код в рег выражениях )))

Читайте также: