Тип «Число»
Тип Число представляет собой число произвольной точности с фиксированной точкой.
Значение типа Число может быть задано литералом одного из следующих видов:
- Двоичное число:
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; РГ =,; РД =.; ОК =ПВВ;'тест'.
Список специальных флагов
| Специальный флаг | Описание | Пример |
|---|---|---|
| РГ | «Разделитель групп». Определяет разделитель групп в целой части. Принимает как значение символ разделителя (или символ в Unicode). Ожидается только вместе с флагом _, включающим разделение по группам. | Формат _;РГ=, для числа 123456789 даст результат 123,456,789. |
| РД | «Разделитель дробной». Определяет разделитель между целой и дробной частями. Принимает как значение символ разделителя (или символ в Unicode). | Формат РД=, для числа 123.456 даст результат 123,456. |
| ОК | «Округление». Определяет режим округления. Ожидается только вместе с указанием точности. Принимает одно из значений перечисления ВидОкругления (по умолчанию: ПВВ) из таблицы ниже. | См. таблицу ниже. |
Список видов округления
| Вид округления | Описание | Пример |
|---|---|---|
| ВН | Округление «Вниз». Округляет к меньшему ближайшему целому. | Формат .0;ОК=ВН для числа 1.9 даст результат 1. |
| ВВ | Округление «Вверх». Округляет к большему ближайшему целому. | Формат .0;ОК=ВВ для числа 1.1 даст результат 2. |
| ПВН | Округление «ПоловинаВниз». Если < 5, округляет к меньшему ближайшему целому. | Формат .0;ОК=ПВН для числа 1.5 даст результат 1. |
| ПВВ | Округление «ПоловинаВверх». Если >= 5, округляет к большему ближайшему целому. | Формат .0;ОК=ПВВ для числа 1.5 даст результат 2. |
Суффикс
Суффикс — это текстовая часть форматной строки (набор символов), которая добавляется после отформатированного числа.
Например, для числа 123.123 применим форматную строк у -6.2' руб.'. Получим: 123,12 руб..
При использовании символа одинарной кавычки ' в суффиксе его необходимо экранировать другой одинарной кавычкой перед ним: '' (то есть две идущие подряд одинарные кавычки).
Например, для числа 123.123 применим форматную строку 'Значение типа ''Цена'' = '-6.2' руб.'. Получим: Значение типа 'Цена' = 123,12 руб..
Именованные стандартные форматы
Для упрощения работы с форматными строками можно использовать именованные стандартные форматы, для которых используется следующий синтаксис:
"['префикс']именованный_формат['суффикс']"
Именованные стандартные форматы заменяют форматную часть строки и позволяют стандартизировать различные форматы чисел. Список именованных стандартных форматов представлен ниже.
Деньги
Денежный/финансовый формат. Соответствует форматной строке _.2.
Например, формат "Деньги' руб.'" для числа 123123.123 даст результат: 123 123,12 руб..
Основание
Представляет число в другой системе счисления по указанному основанию. Доступно только для целых чисел. Если исходное число не является целым или его вещественная часть не эквивалента 0, выбрасывается следующая ошибка: «Перевод нецелых чисел в другие системы счисления не поддерживается». Доступны системы счисления от 2 до 36. Целая часть не разбивается на группы. Ширина строки — минимально возможная для вывода числа в выбранной системе счисления. Для оснований от 2 до 9 возможны оба варианта синтаксиса: ОснованиеX или Основание0X.
Например, формат Основание2 для числа 123 даст результат 1111011.
Процент
Процентный формат. Соответствует форматной строке _.2'%'.
Например, формат Процент для числа 0.12345 даст результат 12,35%.
Число прописью
Чтобы отобразить число прописью, используйте методы типа Пропись:
Число()— возвращает запись числа, переданного в качестве параметра.ДенежнаяСумма()— возвращает запись суммы, состоящей из числа и названия денежной единицы, переданных в качестве параметров.Количество()— возвращает запись количества, состоящего из числа и названия единицы исчисления, переданных в качестве параметров.
Вы можете от форматировать выводимое значение числа, передавая в методы параметры форматирования или формат типа ФорматЧислаПрописью, ФорматСуммыПрописью или ФорматКоличестваПрописью.
Параметры форматирования
Поддерживаются следующие параметры:
Для всех методов:
-
Локаль — локаль, для которой необходимо сформировать запись. Если запись формируется без денежных единиц, то можно задать любой язык в соответствии с ISO 639-1.
Поддерживаемые локали
Обозначение Язык zh китайский vi вьетнамский en английский tr Турецкий fi Финский et Эстонский ro Румынский hu Венгерский tk Туркменский ka Грузинский az Азербайджанский kk Казахский bg Болгарский de Немецкий fr Французский lt Литовский lv Латышский ru Русский be Белорусский uk Украинский pl Польский -
ИспользоватьИ (только для английского языка) — определяет, использовать ли союз
andперед записью десятков и единиц. Значение по умолчанию —Ложь. -
КраткаяФорма (только для турецкого языка) — определяет сокращенную или стандартную запись числа. Значение по умолчанию —
Ложь. -
ФинансоваяФорма (только для китайского и болгарского языков) — определяет формирование прописи числа в виде, принятом для финансовых операций. Значение по умолчанию —
Ложь.
Для форматирования числа:
- Род — используется для языков, в которых числительные склоняются по родам. Значение по умолчанию —
Неопределено.
метод ПримерыСозданияФорматаЧисло()
пер ФорматЧислаПрописьюЧерезКонструктор = новый ФорматЧислаПрописью(
Локаль = Локаль.ИзСтроки("ru"),
Род = РодСлова.Средний)
;
Для форматирования суммы:
- ДенежнаяЕдиница — 3-символьный код денежной единицы по ISO 4217. По умолчанию используется денежная единица соответствующего языка.
- ВключатьДробнуюЧасть — выводит дробную часть числа. Значение по умолчанию —
Истина. - ДробнаяЧастьПрописью — выводит дробную часть числа прописью. Значение по умолчанию —
Ложь.
метод ПримерыСозданияФорматаСумма()
пер ФорматСуммыПрописьюЧерезКонструктор = новый ФорматСуммыПрописью(
Локаль = Локаль.ИзСтроки("en"),
ДенежнаяЕдиница ="RUB",
ДробнаяЧастьПрописью = Истина)
;
Для форматирования количества:
- ВключатьДробнуюЧасть — выводит дробную часть числа. Значение по умолчанию —
Истина. - ДробнаяЧастьПрописью — выводит дробную часть числа прописью. Значение по умолчанию —
Ложь. - Другое, Один, Немного, Много, Ноль, Род — параметры, описывающие склонение названия целой части единицы исчисления.
- ДробнаяЧастьДругое, ДробнаяЧастьОдин, ДробнаяЧастьНемного, ДробнаяЧастьМного, ДробнаяЧастьНоль, ДробнаяЧастьРод — параметры, описывающие склонение названия дробной части единицы исчисления.
метод ПримерыСозданияФорматаКоличество()
пер ФорматКоличестваПрописьюЧерезКонструктор = но вый ФорматКоличестваПрописью(
Локаль = Локаль.ИзСтроки("pl"),
Род = РодСлова.Женский,
Один = "paczka",
Немного = "paczki",
Много = "paczek",
Другое = "paczki")
;
Примеры
метод КоличествоПачекТекстом(КоличествоПачек: Число): Строка
пер Результат = ""
если Локаль.ТекущаяЛокальОтображения().КодРегиона == "RU"
Результат = Пропись.Количество(КоличествоПачек, новый ФорматКоличестваПрописью(
Локаль = Локаль.ИзСтроки("ru"),
Один = "пачка",
Немного = "пачки",
Много = "пачек",
Род = РодСлова.Женский))
// Одна пачка
// Три пачки
// Девять пачек
;
если Локаль.ТекущаяЛокальОтображения().КодРегиона == "EN"
Результат = Пропись.Количество(КоличествоПачек, новый ФорматКоличестваПрописью(
Локаль = Локаль.ИзСтроки("en"),
Один = "pack",
Другое = "packs"))
// Twelve Million Three Hundred Forty-five Thousand Six Hundred Seventy-two packs
// Twelve Million Three Hundred Forty-five Thousand Six Hundred Seventy-one pack
;
возврат Результат
;
метод СтоимостьПачекТекстом(СтоимостьПачек: Число):Строка
пер Результат = ""
если Локаль.ТекущаяЛокальОтображения().КодРегиона == "RU"
Результат = Пропись.ДенежнаяСумма(СтоимостьПачек, новый ФорматСуммыПрописью(
Локаль = Локаль.ИзСтроки("ru"),
ДенежнаяЕдиница = "USD"))
// Двенадцать миллиардов триста сорок пять миллионов шестьсот семьдесят восемь тысяч
// девятьсот два доллара США двадцать два цента
;
если Локаль.ТекущаяЛокальОтображения().КодРегиона == "EN"
Результат = Пропись.ДенежнаяСумма(СтоимостьПачек, новый ФорматСуммыПрописью(
Локаль = Локаль.ИзСтроки("en"),
ДенежнаяЕдиница = "USD"))
// twelve billion, three hundred and forty-five million, six hundred and seventy-eight thousand
// nine hundred and twelve dollars and twenty two cents
;
возврат Результат
;