Как проверить целое число или нет 1с

Обновлено: 07.07.2024

Рассмотрим один из примитивных типов, с которым приходится сталкиваться разработчикам на платформе 1С 8.3, – Число. В этой статье мы научимся задавать числа в коде, создавать реквизиты с типом число , получать случайное число, округлять числа и получать из числа с дробью целое число.

Тип число в 1С

Задать число в коде просто: нужно какой-то переменной просто присвоить определенное число.

Так задаётся целое число:

А так задаются дробные числа:

Над числами в коде можно выполнять простые арифметические операции: сложение, вычитание, умножение и деление.

Причем, как непосредственно над числами:

Так и над переменными с типом число:

Если нужно инвертировать число, т.е. поставить какому-то уже заданному числу обратный знак (например, было 5, стало -5), то его нужно умножить на -1.

Сделать это можно несколькими способами:

Если нам нужно создать реквизит какого-то объекта, с типом число, то в свойстве Тип реквизита нужно выбрать тип Число. На картинке ниже у справочника создан реквизит с типом Число.

Тип число

А также задать его точность и длину.

Длина и точность типа число

Остановимся на точности и длине подробнее.

Точность – это максимальное количество знаков после запятой.

Длина – это максимальное количество разрядов в числе (включая знаки после запятой).

Например, если длина 5, а точность 3, то максимальное число будет 99,999.

Если длина 5, а точность 0, то – 99999.

А если длинна 3, а точность 3, то – 0,999. Т.е когда длинна равна точности мы не сможем задать число равное 1.

Когда мы в коде задаем переменную с типом Число, то мы не ограничиваем эту переменную по длине и точности, в тоже время для реквизита объекта с типом Число нужно это делать заранее. При разработке вы должны заранее предусмотреть, какие у реквизита числового типа будет длинна и точность.

Точно также, реквизит с типом число нужной длинны и точности можно создать на управляемой форме.

Число на управляемой форме 1С

Случайное число в 1С

В платформе 1С 8.3 имеется возможность сгенерировать случайное целое число при помощи генератора случайных чисел, который так и называется ГенераторСлучайныхЧисел. Для генерации случайного числа нужно воспользоваться методом этого объекта СлучайноеЧисло.

Рассмотрим, простой пример генерации случайного числа.

В этом случае Число1 будет сгенерировано от 0 до 4294967295 (2^32 -1).

В примере выше метод СлучайноеЧисло без параметров, но у этого метода есть два параметра:

Оба параметра являются необязательных и с их помощью можно задать верхнюю и нижнюю границу генерации случайных чисел. Причем параметр НижняяГраница не может быть меньше нуля, а параметр ВерхняяГраница не может быть больше 4294967295.

Например, в этом случае будет сгенерировано случайное число от 1 до 100.

Округлить число в 1С

В платформе 1С имеется возможность округления чисел по определенному правилу. Для этих целей существует метод Окр. Этот метод является функцией, которая принимает число, нужное для округления, и возвращает округленное число. Данный метод имеет следующий синтаксис:

Число – число, которое будет округляться;

Разрядность – до какого количества знаков после запятой нужно округлить число (если разрядность равна 0, то число будет округлено до целого числа).

РежимОкругления – системное перечисление, которое имеет два значения: РежимОкругления.Окр15как10 – в этом случае 1.5 округляется до 1, РежимОкругления.Окр15как20 – 1.5 округляется до 2. Если этот параметр не задан, то по умолчанию 1.5 округляется до 2

В этом случае будет следующий результат:

Округлить число в 1С

Целое число в 1С

Если предыдущий метод округляет число, то также имеется возможность получать целое число, т.е. просто отбросить дробную часть числа. Делает это метод Цел. Данный метод является функцией, принимающей единственный параметр – число, у которого нужно отбросить дробную часть, и возвращающей полученное целое число.

Рассмотрим работу этого метод в сравнении с методом округления числа.

Должен получиться следующий результат:

Целое число и округлить число в 1С

Из результата вы видите, что нельзя использовать метод Окр для получения целого числа, он именно округляет и не всегда может дать требуемый результат. Для получения целого числа используйте метод Цел.

Степень числа в 1С

В платформе 1С имеется возможность возвести нужное число в степень. Делается это при помощи метода Pow, который является функцией со следующим синтаксисом.

Рассмотрим ряд примеров:

Степень числа в 1С

Из примеров видно, что мы можем возводить в положительную и отрицательную степень, а также степень может быть дробной.

Функции чисел в 1С

В платформе 1С 8.3 имеется другие функции пот работе с числами , познакомится с ними можно в синтаксис-помощнике. В подразделе Функции работы со значениями типа Число.

Функции работы со значениями типа число

Другие статьи о примитивных типах:

Программировать в 1С за 11 шагов

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


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

можно оплатить вручную:

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

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