Тип Число представляет собой число произвольной точности с фиксированной точкой.
Значение типа Число может быть задано литералом одного из следующих видов:
- Двоичное число:
0b{0|1}+.
- Десятичное число:
[+|-]{0..9}[.{0..9}].
- Шестнадцатеричное число:
0x{0..9|a..f|A..F}+.
Также значение типа Число может быть задано с помощью конструктора, который преобразует строковое представление в соответствующий экземпляр числа. С помощью перегрузки конструктора можно преобразовать число с заданным основанием.
Число состоит из знака, а также целой и дробной частей, разделенных точкой. Для двоичных и шестнадцатеричных чисел задать дробную часть нельзя, так как такие числа могут быть только целыми.
Операции, определенные для значений типа Число, описаны в разделе Операции.
Пример работы с числами
Использование литерала
пер А: Число
А = 15
А = 3.141592654
А = 15/7
А = 0xff
А = -0xff
А = 0b10101
Использование конструктора
новый Число("123") -> 123
новый Число("+1.23") -> 1.23
новый Число("-12.3") -> -12.3
новый Число("1.23e+2") -> 123
новый Число("-1.23e2") -> -123
Использование конструктора с заданным основанием
новый Число("123", 10) -> 123
новый Число("+4f865", 16) -> 325733
новый Число("cDf65", 16) -> 843621
новый Число("-3E8", 16) -> -1000
новый Число("123E-2", 10) -> 1.23
Представление чисел в зависимости от локали
В зависимости от текущей локали представление числа будет отличаться:
- В русской локализации в качестве разделителя между целой и дробной частью используется запятая, а группы по три цифры в целой части отделяются неразрывным пробелом —
123 456,78.
- В английской локализации дробная часть отделяется точкой, а группировка целой части выполняется через запятую —
123,456.78.
Форматирование чисел
Для форматирования чисел используется встроенный метод Представление(), который принимает как аргумент указанный формат и возвращает строку с числом в этом формате.
В примере ниже для числа 123.456 вызывается метод Представление(). Он представляет это число в формате 'Результат: '6.2, который передается этому методу как аргумент. Результат форматирования помещается в переменную Б:
пер А: Число = 123.456
пер Б = а.Представление("'Результат: '6.2")
Значение пе ременной Б: Результат: 123,46.
При указании формата используется специальный синтаксис. Так, в примере выше форматная строка 'Результат: '6.2 состоит из следующих частей: 'Результат: ' — префикс, 6 — ширина, 2 — точность. Подробнее о синтаксисе форматных строк смотрите ниже.
Синтаксис форматной строки
В общем случае синтаксис форматной строки выглядит следующим образом:
"['префикс'][флаги][ширина][.точность][специальные флаги]['суффикс']"
Вся форматная строка выделяется двойными кавычками. Префикс и суффикс указываются в отдельных одинарных кавычках (для экранирования). Они являются необязательной частью форматной строки, т. е. могут не указываться. Составляющие форматирующей части (флаги, ширина, точность, специальные флаги) должны следовать строго друг за другом в соответствии с синтаксисом.
Префикс
Текстовая часть форматной строки, которая добавляется перед отформатированным числом.
Например, для числа 123.123 применим форматную строку 'знач ='7.2. Получим: знач = 123,12.
При использовании символа одинарной кавычки ' в префиксе его необходимо экранировать другой одинарной кавычкой перед ним: '' (то есть две идущие подряд одинарные кавычки).
Например, для числа 123.123 применим форматную строку 'Значение типа ''Число'' ='7.2. Получим: Значение типа 'Число' = 123,12.
Флаги
Используются непосредственно для форматирования выводимого числа. В отличие от специальных флагов определяются одним символом. Флаги указываются без разделительных знаков в произвольном порядке. При заполнении «свободного места», то есть разницы между исходными и указанными шириной/точностью, заполнитель по умолчанию — пробелы слева.
Список флагов
| Флаг | Описание | Пример |
|---|
| 0 | Свободное место заполняется нулями слева. Несовместим с флагом -. | Для числа 123.456 применим форматную строку 08.2. Получим: 00123,46. |
| - | Свободное место заполняется пробелами справа. Несовместим с флагом 0. | Для числа 123.456 применим форматную строку -7.2'₽'. Получим: 123,46 ₽. |
| + | Положительные числа выводятся со знаком +. | Для числа 123.456 применим форматную строку +7.2. Получим: +123,46. |
| _ | Группировка целой части по 3 цифры, начиная с младшего разряда. Формируется в зависимости от локали. | Для числа 123456789 применим форматную строку _10.2. Получим: 123 456 789,00. |
| ( | Отрицательные числовые значения заключаются в скобки и берутся по модулю. Пишутся без знака -. | Для числа -123.456 применим форматную строку (6.2. Получим: (123,46). |
Ширина
Определяет общую ширину числа после форматирования (без префикса и суффикса). Если ширина меньше полученного числа (с соблюдением всех флагов, включая специальные), то она динамически расширяется до ширины числа. Если ширина больше результата, то свободное место заполняется в соответствии с указанным флагом. Если ширина не указана, то она будет минимально возможной для вывода отформатированного числа.
Примеры:
- Для числа
123.123 укажем ширину 10. Получим: 123,123.
- Для числа
123.123 укажем ширину 1. Получим: 123,123.
Точность
Определяет точность дробной части. Если указанная точность меньше, чем в исходном числе, то значение после десятичного разделителя округляется (по умолчанию: округление к ближайшему целому). Округление настраивается с помощью специального флага (ОК). Если указанная точность больше числа, то дробная часть дополняется нулями с конца. Если точность не указывается, то она соответствует точности исходного числа.
Например, для числа 123.456 укажем точность .2. Получим: 123,46 (символ разделителя целой и дробной части определяется локалью, если в форматной строке не указан другой символ разделителя).
Специальные флаги
Специальные флаги записываются следующим образом: специальный флаг=значение, где значение — это разделитель или режим округления. Специальные флаги используются непосредственно для форматирования выводимого числа. В отличие от обычных флагов определяются не одним символом, а выражением. Специальные флаги разделяются точкой с запятой ; и могут указываться в произвольном порядке. От предыдущей части форматной строки (если есть) также отделяются точкой с запятой.
Пример: 'значение='РД=,'₽'.
Для удобства чтения допускается использование пробела (пробелов) для отделения специального флага от знака присваивания, но не допускается использование пробела после знака присваивания или после знака разделителя, так как в этом случае пробел будет восприниматься встроенным языком как собственно разделитель или часть разделителя.
Пример: 'тест'(+_15.2; РГ =,; РД =.; ОК =ПВВ;'тест'.
Список специальных флагов