1с это число функция

Обновлено: 07.07.2024

Дано: много строк (>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)

Распечатать

10060 (0x0000274C): Попытка установить соединение была безуспешной  18
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С  42
Для формирования и выполнения запросов к таблицам базы данных в платформе 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С 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. Использование для каких-либо других целей не рекомендуется. В новых версиях платформы данные функции не работают (хотя их описание присутствует в справке).

ВвестиСтроку

Числовым у нас может быть реквизит объекта конфигурации или переменные в модулях.

Максимально допустимая разрядность числа составляет 38 знаков, длина целой части не может превышать 32 символа, точность — 10 символов. Хотя в переменных можно оперировать числами превышающих разрядность в 38 символов, но в ИБ (информационную базу) можем записывать значения с длинной целой части не больше 32‑х знаков.

Над данными числового типа применимы операции: +, -, *, /, ( ), %(остаток от деления нацело 10%3=1).

Математические функции для чисел можно посмотреть в синтакс помощнике
Общее описание встроенного языка-> Встроенные функции-> Функции по работе с типом Число

Из всех функции, которые там приведены лично мне пока пришлось работать только с двумя:
Окр(<Число>, <Разрядность>, <РежимОкругления>) Функция округляет исходное число до нужной разрядности в соответствии с заданным режимом округления.
Параметры: <Число> (обязательный), Исходное число. Остальные параметры не обязательны.

Цел(<Число>) — Функция вычисляет целую часть переданного числа, полностью отсекая дробную часть.

Пример: МожноКупить = Цел ( Наличность / Цена );

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

Часто на практике встречается преобразование типов данных из строки в число, для этих целей есть функция Число().

Функция Число() — Преобразует полученный параметр (параметр обычно строкового типа) в значение типа Число.
Пример: КонтрольноеЧисло = Число ( Прав ( СтраховойНомер , 2 ));

Типа Булево преобразуется в число:
• Ложь преобразуется в 0;
• Истина преобразуется в 1.

Приоритет арифметических операций:
1) ( )
2) Унарные арифметические операции (+, -)
3) *, /, %
4) Бинарные арифметические операции (+, -)
5) Операции сравнения (>,>=,
6) НЕ
7) И
8) ИЛИ

Приведу еще пару функций которые полезны при работе с Числом

Формат(<Значение>, <ФорматнаяСтрока>) Функция формирует удобное для чтения представление значений.
Параметры: <Значение> (обязательный) Тип параметра: Число; Дата; Булево.

Форматную строку удобно задавать, вызвав: Конструктор форматной строки

Макс(<Значение1>,…,<ЗначениеN>) Функция определяет максимальное значение из полученных параметров.
Параметры: <Значение1>,…,<ЗначениеN> (обязательный) и могут иметь один Тип: Число; Строка; Дата; Булево.

Пример:
// Пример для чисел

Мин(<Значение1>,…,<ЗначениеN>) Из полученных параметров функция определяет минимальное значение.

Пример:

// Пример для чисел

Часто встречаются задачи, когда число надо представить прописью, для этих целей есть функиця:
ЧислоПрописью(<Число>, <ФорматнаяСтрока>, <ПараметрыПредметаИсчисления>) Функция формирует представление числа прописью.

Я не старался переписать справку, хотя скорей всего так и получилось.
Чаще заглядывайте в синтакс-помощник.

В данных статьях я описывал примитивные типы данных: Работа со строками 1С и NULL 1C.

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