Spec-Zone.ru › Ada 2022
Справочник Ada (Ada 2022)

F.3.2 Генерация отформатированного выходного значения

Динамическая семантика

Содержание отформатированной выходной строки основано на:
  • Значении Item некоторого десятичного типа Num,
  • Расширенном шаблоне String Pic_String,
  • Булевом значении Blank_When_Zero,
  • Строке валюты,
  • Символе заполнения,
  • Символе разделителя и
  • Символе разделителя десятичной точки.
Сочетание значения True для Blank_When_Zero и символа '*' в Pic_String является несогласованным; отформатированная выходная строка не определена.
Ошибка форматирования обнаружена в правилах ниже, если ведущие ненулевые цифры Item, символы строки валюты или знак минус будут усечены; в таких случаях отформатированная выходная строка не определена.
Отформатированная выходная строка имеет нижнюю границу 1 и верхнюю границу N, где N = Pic_String'Length + Currency_Length_Adjustment – Radix_Adjustment, и
  • Currency_Length_Adjustment = Currency'Length – 1, если в Pic_String встречается символ '$', и 0 в противном случае.
  • Radix_Adjustment = 1, если в Pic_Str встречается символ 'V' или 'v', и 0 в противном случае.
Пусть модуль Item выражается как десятичное число Ip···I1.F1···Fq, называемое отображаемым модулем Item, где:
  • q = Min(Max(Num'Scale, 0), n), где n равно 0, если Pic_String не содержит разделитель, и в противном случае равно количеству позиций цифр после разделителя в Pic_String, где позиция цифры соответствует появлению '9', символу подавления нулей (для числа с подавлением всех нулей), символу валюты (для числа со всеми символами валюты) или символу знака (для числа со всеми символами знака).
  • Ip ≠ 0, если p>0.
Если n < Num'Scale, то указанное выше число является результатом округления (от нуля, если точно посередине между значениями).
Если Blank_When_Zero = True и отображаемый модуль Item равен нулю, то отформатированная выходная строка состоит из всех символов пробела. В противном случае шаблон String обрабатывается как последовательность экземпляров синтаксических категорий, согласно правилам в F.3.1, и отформатированная выходная строка представляет собой конкатенацию строковых значений, полученных из этих категорий в соответствии со следующими правилами сопоставления.
Таблица F.1 показывает сопоставление символа управления знаком со соответствующим символом или строкой в отформатированном выводе. В столбцах, показывающих отформатированный вывод, строчная буква «b» представляет собой символ пробела. Если символ управления знаком отсутствует, но значение Item отрицательное, возникает ошибка форматирования, и отформатированная выходная строка не создается.
Таблица F.1: Отформатированный вывод для символов управления знаком
Символ управления знаком Отформатированный вывод для
Неотрицательного числа
Отформатированный вывод для
Отрицательного числа
'+' '+' '–'
'–' ' ' '–'
'<' ' ' '('
'>' ' ' ')'
"CR" " " "CR"
"DB" " " "DB"
Экземпляр fixed_LHS_sign отображается символом, как показано в таблице F.1.
Экземпляр fixed_$_char отображается строкой Currency.
Экземпляр direct_insertion отображается символом Separator, если direct_insertion = '_', и символом direct_insertion в противном случае.
Экземпляр number отображается строкой целая_часть & десятичная_часть & дробная_часть, где:
  • Строка для целая_часть получается следующим образом:
1.
Вхождения '9' в fore_digits of number заменяются справа налево десятичными цифрами I1, ..., Ip соответственно.
2.
Каждое вхождение '9' в fore_digits слева от самого левого '9', замененного согласно правилу 1, заменяется на '0'.
3.
Если p превышает количество вхождений '9' в fore_digits of number, то избыточные левые цифры могут быть использованы для отображения экземпляра zero_suppression, floating_LHS_sign, floating_$_currency или floating_#_currency слева от number; если такого экземпляра нет, то возникает ошибка форматирования, и отформатированная выходная строка не создается.
  • десятичная_часть:
"" если number не содержит разделителя, если radix = 'V' или radix = 'v'
Radix_Mark, если number содержит '.' в качестве разделителя
  • Строка для дробная_часть получается следующим образом:
1.
Вхождения '9' в aft_digits of number заменяются слева направо десятичными цифрами F1, ... Fq.
2.
Каждое вхождение '9' в aft_digits справа от самого правого '9', замененного согласно правилу 1, заменяется на '0'.
Экземпляр zero_suppression отображается строкой, полученной следующим образом:
1.
Правые символы 'Z', 'z' или '*' заменяются избыточными цифрами (если есть) из целая_часть сопоставления number справа от экземпляра zero_suppression,
2.
Символ context_sensitive_insertion заменяется как символ direct_insertion, если он встречается справа от некоторых 'Z', 'z' или '*' в zero_suppression, которые были сопоставлены с избыточной цифрой,
3.
Каждый символ слева от самого левого символа, заменённого согласно правилу 1 выше, заменяется на:
пробел, если символ подавления нулей 'Z' или 'z', или
символ Fill, если символ подавления нулей '*'.
4.
Возникает ошибка форматирования, если после замены согласно правилу 1 остаются избыточные цифры, после всех символов 'Z', 'z' и '*' в zero_suppression; отформатированная выходная строка не создается.
Экземпляр RHS_sign отображается символом или строкой, как показано в таблице F.1.
Экземпляр floating_LHS_sign отображается строкой, полученной следующим образом:
1.
Все, кроме одного, правых символов LHS_Sign заменяются избыточными цифрами (если есть) из целая_часть сопоставления number справа от экземпляра floating_LHS_sign.
2.
Следующий символ заменяется символом, заданным в таблице F.1, соответствующим символу LHS_Sign.
3.
Символ context_sensitive_insertion заменяется как символ direct_insertion, если он встречается справа от самого левого замененного символа LHS_Sign в соответствии с правилом 1.
4.
Любой другой символ заменяется символом пробела.
5.
Возникает ошибка форматирования, если после замены согласно правилу 1 остаются избыточные цифры; отформатированная выходная строка не создается.
Экземпляр fixed_#_currency отображается строкой Currency с n пробелами, добавленными слева (если экземпляр не следует за разделителем) или справа (если экземпляр следует за разделителем), где n – разница между длиной экземпляра fixed_#_currency и Currency'Length. Возникает ошибка форматирования, если Currency'Length превышает длину экземпляра fixed_#_currency; отформатированная выходная строка не создается.
END_OF_DOCUMENT_MARKER
Экземпляр floating_$_currency сопоставляется со строкой, полученной следующим образом:
1.
Все, кроме одного правого символа '$', заменяются избыточными цифрами (если есть) из целой части отображения числа, расположенного справа от экземпляра floating_$_currency.
2.
Следующий символ слева заменяется строкой валюты.
3.
Символ context_sensitive_insertion заменяется так, как если бы он был символом direct_insertion, если он находится справа от левого символа '$', заменённого по правилу 1.
4.
Каждый другой символ заменяется пробелом.
5.
Возникает ошибка форматирования, если после замены по правилу 1 остаются избыточные цифры; отформатированная строка не создаётся.
Экземпляр floating_#_currency сопоставляется со строкой, полученной следующим образом:
1.
Все, кроме одного правого символа '#', заменяются избыточными цифрами (если есть) из целой части отображения числа, расположенного справа от экземпляра floating_#_currency.
2.
Подстрока, последний символ которой находится в позиции, непосредственно предшествующей самому левому символу, заменённому по правилу 1, и длина которой равна длине строки валюты, заменяется строкой валюты.
3.
Символ context_sensitive_insertion заменяется так, как если бы он был символом direct_insertion, если он находится справа от левого символа '#', заменённого по правилу 1.
4.
Любой другой символ заменяется пробелом.
5.
Возникает ошибка форматирования, если после замены по правилу 1 остаются избыточные цифры или если нет подстроки с требуемой длиной для замены по правилу 2; отформатированная строка не создаётся.
Экземпляр all_zero_suppression_number сопоставляется с:
  • строкой из пробелов, если абсолютная величина значения Item равна нулю, символ zero_suppression_char равен 'Z' или 'z', и у экземпляра all_zero_suppression_number нет символа radix в последней позиции;
  • строкой, содержащей символ заполнения во всех позициях, кроме позиции символа (если он есть), соответствующего radix, если zero_suppression_char = '*' и абсолютная величина значения Item равна нулю;
  • в противном случае, результат такой же, как если бы каждый символ zero_suppression_char в all_zero_suppression_aft был равен '9', интерпретируя экземпляр all_zero_suppression_number как либо zero_suppression number (если присутствуют radix и all_zero_suppression_aft), либо как zero_suppression иначе.
Экземпляр all_sign_number сопоставляется с:
  • строкой из пробелов, если абсолютная величина значения Item равна нулю и у экземпляра all_sign_number нет символа radix в последней позиции;
  • в противном случае, результат такой же, как если бы каждый символ sign_char в all_sign_number_aft был равен '9', интерпретируя экземпляр all_sign_number как либо floating_LHS_sign number (если присутствуют radix и all_sign_number_aft), либо как floating_LHS_sign иначе.
Экземпляр all_currency_number сопоставляется с:
  • строкой из пробелов, если абсолютная величина значения Item равна нулю и у экземпляра all_currency_number нет символа radix в последней позиции;
  • в противном случае, результат такой же, как если бы каждый символ currency_char в all_currency_number_aft был равен '9', интерпретируя экземпляр all_currency_number как floating_$_currency number или floating_#_currency number (если присутствуют radix и all_currency_number_aft), либо как floating_$_currency или floating_#_currency иначе.

Примеры

Примеры использования отформатированного результата; в показанных ниже строках результата 'b' представляет пробел:
Item: Рисунок и строки результата:
123456.78 Рисунок: "-###**_***_**9.99"
Результат: "bbb$***123 456.78"
"bbFF***123.456 78" (валюта = "FF",
разделитель = '.',
разделитель десятичных знаков = ',')
123456.78 Рисунок: "-$**_***_**9.99"
Результат: "b$***123 456.78"
"bFF***123.456 78" (валюта = "FF",
разделитель = '.',
разделитель десятичных знаков = ',')
0.0 Рисунок: "-$$$$$$.$$"
Результат: "bbbbbbbbbb"
0.20 Рисунок: "-$$$$$$.$$"
Результат: "bbbbbb$.20"
-1234.565 Рисунок: "<<<<_<<<.<<###>"
Результат: "bb(1 234.57DMb)" (валюта = "DM")
12345.67 Рисунок: "###_###_##9.99"
Результат: "bbCHF12 345.67" (валюта = "CHF")


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API