Проверить является ли символ цифрой 1с
Функции для работы со строками в 1С 8.2 и 8.3
Строка
Функция Строка(x) возвращает текстовое представление переданного ей значения “x”.
СтрДлина
Функция СтрДлина(x) вычисляет количество символов в строке “x”, учитывая пробелы и ничего не значащие символы.
СокрЛП, СокрЛ, СокрП
Функции СокрЛП(x), СокрЛ(x) и СокрП(x) убирают пробелы и ничего не значащие символы у переданной строки “x” с обеих сторон, слева и справа соответственно.
Лев, Прав, Сред
Функции Лев(x, y) и Прав(x, y) возвращают количество символов “y” с левого или правого края переданной им строки “x”. А функция Сред(x, y, z) возвращает количество символов “z” из указанного места “y” переданной строки “x”.
ВРег, НРег, ТРег
Сообщить(ТРег("Каждое слово с заглавной буквы")); //Каждое Слово С Заглавное БуквыНайти
Функция Найти(x, y) возвращает номер первого символа первого вхождения подстроки “y” в строку “x”, если, конечно, такое вхождение найдено (при этом нумерация начинается с 1). Если же вхождений не найдено, то функция возвращает 0.
СтрЧислоВхождений
Функция СтрЧислоВхождений(x, y) возвращает количество вхождений подстроки “y” в строку “x”.
СтрЗаменить
Функция СтрЗаменить(x, y, z) позволяет в указанной строке “x” заменить все вхождения одной подстроки “y” на другую “z”, результатом выполнения функции будет строка с проведенными заменами.
Сообщить(СтрЗаменить("тест1,тест2,тест3,тест4", ",", " ")); //тест1 тест2 тест3 тест4ПустаяСтрока
СтрЧислоСтрок
Функция СтрЧислоСтрок(x) возвращает количество строк в многострочном тексте “x”.
МногострочныйТекст = СтрЗаменить("тест1,тест2,тест3,тест4", ",", Символы.ПС); //тест1 тест2 тест3 тест4СтрПолучитьСтроку
Функция СтрПолучитьСтроку(x, y) возвращает строку с номером “y” из многострочного текста “x”.
МногострочныйТекст = СтрЗаменить("тест1,тест2,тест3,тест4", ",", Символы.ПС); //тест1 тест2 тест3 тест4 Сообщить(СтрПолучитьСтроку(МногострочныйТекст, 2)); //тест2Символ, КодСимвола
Символы
Это не функция, а набор наиболее часто используемых специальных символов, состоит из:
ЗначениеВСтрокуВнутр, ЗначениеИзСтрокиВнутр
Функция ЗначениеВСтрокуВнутр(x) возвращает системное строковое представление значения “x”. Функция ЗначениеИзСтрокиВнутр(x) проделывает обратную операцию и возвращает значение, полученное из строкового системного представления “x”. Обе эти функции используются для сохранения функциональной совместимости с версией 7.7. Использование для каких-либо других целей не рекомендуется. В новых версиях платформы данные функции не работают (хотя их описание присутствует в справке).
ВвестиСтроку
Дано: много строк (>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)
Строки сравниваются посимвольно по коду символа, для ясности несколько примеров "Строка12" < "Строка2", "8.3.9.2000" > "8.3.8", "8.3.9.2000" > "8.3.10"
С учетом регистра можно сравнить строки через знаки сравнения как в примерах
Сравнение без учета регистра можно произвести функций СтрСравнить. Поддерживается с платформы 8.3.6.
- -1 - первая строка меньше второй
- 1 - первая строка больше второй.
- 0 - первая строка равна второй
Преобразование в строку (Строка, Формат)
В языке 1С есть автоматическое преобразование типа когда все части выражения приводятся к типу первого выражения
Преобразование функцией Строка
при преобразовании появляется символ неразрывный пробел, а он обычно не нужен
"Правильнее" будет преобразовывать функцией формат, которая приводит к строке простые типы и можно воспользоватся конструктором
Строка на разных языках НСтр
Форматирование строки по шаблону СтрШаблон. Поддерживается с платформы 8.3.6.
Очень полезная функция которая позволяет избежать соединения строк и сделать текст более читабельным
Функции СтрСоединить, СтрРазделить. Поддерживается с платформы 8.3.6.
Очень полезные функции улучшают читаемость кода.
СтрРазделить удобна когда необходимо разобрать строку с разделителями, например CSV файл, разбор текста на слова, строки
Аналогично, только наоборот работает функция СтрСоединить, преобразуя массив к строке.
Другие функции работы со строками, которые могут быть полезныСтрСократить (Текст, Количество, Многострочная = Ложь) - сокращает текст до заданной длины заменяя окончание на .
ЭтоКорректныйИдентификатор (Строка) - Проверяет является ли строка корректным идентификатором, строка вида СуммаКонтрагента, _Идентификатор
Когда в 1с встает вопрос разбора большого текста это уже зоопарк из СтрДлина, Сред, СтрНайти для повышения читаемости программ для подобных задач использую свои функции: РазборПрочитатьЦелоеЧисло, РазборПрочитатьШестнадцатеричноеЧисло, РазборПрочитатьНезначимые, РазборПрочитатьИдентификатор,
РазборПропуститьНаборСимволов, РазборПрочитатьСимвол, РазборПрочитатьДоСимвола, РазборНайтиТекст
Cклонения по падежам 6
НаКлиенте Процедура Команда1(Команда) ФИО = " Иванов Иван Иванович" ; Падеж = 2; Пол = 1; Результат = СклонениеФИО(ФИО, Падеж, пол); Сообщить(Результат); КонецПроцедуры НаСервере Функция СклонениеФИО(ФИО, Падеж, пол) Результат = " " ; Автоматическая установка ширины колонки табличного документа. 0
Процедура, которая " примерно" делает автоширину колонок (навроде, как если бы выделить все колонки и дважды щелкнуть мышкой по границе заголовка колонки). Привожу текст, работает неахти, но лучше чем ничего: Процедура РасчетШириныКолонок(Табличный Алгоритм шифрования RC4 1
Для решения некоторых задач, иногда требуется имееть возможность шифровать и дешифровывать, какие-то данные. Но при этом нет возможности использовать стороние внешнии компоненты. Предлагаем пример реализации алгоритма шифрования RC4 на встроенном яз Быстрая выгрузка отчетов в Excel, наложение Фильта и отображение ярлыка 0
Вместо Таб.Показать() используем глобальную функцию - и отчет показывается сразу в Excel в удобоваримом виде - с форматированием колонок по ширине, автофильтром и ярлычками листов Процедура глОткрытьВЭкселе(Таб,ИмяФайла=" " ,НеИзменятьВысотуСтроки=0 Вставить формулу, функцию в ячейку Excel 0
Ячейка = Лист.Cells(1,8); Ячейка.Formula=" =SUM(R11C:R C)" ; Процедура Сформировать() Перем Кат,Шаб; Ехсел=СоздатьОбъект(" Excel.Application" ); Книга=Ехсел.Workbooks; Если ФС.ВыбратьФайл(0,Кат,Шаб," Выбери файл Еxcel" ,," *.xls" ,)=1 Тогда Посмотреть все результаты поиска похожих
Еще в этой же категории
Как проверить целое число? Четное число? 2
Функция ЧетноеЧисло(пЧисло) Четное = пЧисло%2=0; Возврат Четное; КонецФункции Функция ровноеЧисло(пЧисло) Четное = пЧисло%2=1; Возврат Четное; КонецФункции //или Фунция ДровноеЧисло (Чис) Возврат Чис = Цел(Чис); КонецФун Ввести число, ввод числа 1
КолВо = 1; Если ВвестиЧисло(КолВо, "Введите количество", 10, 2) Tогда // обработка введенного количество КонецЕсли; Если ВвестиЧисло(Ном, "Введите номер приказа", 5, 0, 10) = 1 Тогда ВыбДок = СоздатьОбъект("Документ.Приказ"); ВыбДок.Найти Функция преобразует переданную сумму, число в строку вида 0
ПарСумма - сумма, число Функция глРубКоп(ПарСумма) Экспорт Если Число(ПарСумма)=0 Тогда Возврат "руб. коп." КонецЕсли; Возврат ""+Цел(ПарСумма)+" руб. "+Формат((ПарСумма-Цел(ПарСумма))* 100,"ЧЦ=2; ЧВН=")+" коп." КонецФункции //Пример обра Функция возвращает число, равное ближайшему целому "сверху" 0
Код одинаков для 7 и 8 версии Функция ЦелМаксимальное(Сумма) Экспорт Возврат ?(Цел(Сумма) = Сумма, Сумма, Цел(Сумма) + 1); КонецФункции Функция преобразует переданную сумму в строку вида 123 руб. 45 коп 0
//ПарСумма - сумма, число //коп - Выводится всегда Функция глРубКоп(ПарСумма) Экспорт Если Число(ПарСумма)=0 Тогда Возврат " руб. коп." КонецЕсли; Возврат " " +Цел(ПарСумма)+" руб. " +Формат((ПарСумма-Цел(ПарСумма))* 100," ЧЦ=2; ЧВН icon-exclamation-sign"> Посмотреть все в категории Работа с Числами
Как проверить,является ли определенный символ в строке числом?
Пользователем вводится строка,после чего нужно посимвольно ее проверить. Если какой-то символ.
Является ли символ числом
Например вводится строка. И надо перебрать её по символам, и если есть числа, то вывести их. Как.
Как определить, является ли строка числом?
нужно проверить является ли строка числом (чтобы были только цыфры) . такой код if.
Так: тут есть неточнось ведь тут может быть не только цыфра или число но и какойто символ например '™' и тогда он выведет что это число надо бы еще проверить на диапазон букв
Именно символ? Символ может являться цифрой или однозначным числом.
В принципе следующий способ пойдет и для символа и для строки
Не совсем по теме, но приятно
А если оно из двух или трех разрядов - значит, уже не символ, а строка (а в стартовом посте вопрос про символ)Как определить, является ли переменная целым числом
Доброй ночи! Есть функция матлаб чтобы определить является ли переменная целым числом, что-нибудь.
Как определить, является ли строка дробным числом?
Есть ли в python аналог isdigit, только для проверки, является ли строка дробным числом?
Как определить является ли введенная строка числом или текстом?
Составить программу, определяющую , является ли веденная строка числом или текстом, а если в строке.
Вывести, является ли символ буквой, числом или специальным символом
Напишите программу, в которой пользователь должен ввести 1 символ. По окончанию программа должна.
Проверить, является ли введенный символ числом (аналог функции is_digit)
У меня есть массив char str=fsda7fd87; И мне нужно вывести в консоль Is Diges = 787; У меня есть.
Ввести с клавиатуры символ. Определить, является ли введённый символ буквой
Ввести с клавиатуры символ. Определить, является ли введённый символ буквой.Заранее благодарчик!
Читайте также: