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

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, то вышеуказанное число является результатом округления (в сторону от 0, если значение находится ровно посередине между значениями).
Если 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 отображается как строка integer_part & radix_part & fraction_part, где:
  • Строка для integer_part получается следующим образом:
1.
Вхождения '9' в fore_digits от number заменяются справа налево на значения символов десятичных цифр для I1, ..., Ip соответственно.
2.
Каждое вхождение '9' в fore_digits слева от самого левого '9', заменённого по правилу 1, заменяется на '0'.
3.
Если p превышает количество вхождений '9' в fore_digits от number, то избыточные самые левые цифры могут использоваться в отображении экземпляра zero_suppression, floating_LHS_sign, floating_$_currency или floating_#_currency слева от number; если такого экземпляра нет, то возникает ошибка форматирования, и отформатированная выходная строка не создается.
  • radix_part:
"" если number не содержит разделитель, если radix = 'V' или если radix = 'v'
Radix_Mark, если number содержит '.' в качестве разделителя
  • Строка для fraction_part получается следующим образом:
1.
Вхождения '9' в aft_digits от number заменяются слева направо на значения символов десятичных цифр для F1, ... Fq.
2.
Каждое вхождение '9' в aft_digits справа от самого правого '9', заменённого по правилу 1, заменяется на '0'.
Экземпляр zero_suppression отображается как строка, полученная следующим образом:
1.
Самые правые символы 'Z', 'z' или '*' заменяются на избыточные цифры (если таковые имеются) из integer_part отображения number справа от экземпляра zero_suppression.
2.
Символ context_sensitive_insertion заменяется как символ direct_insertion, если он находится справа от некоторых 'Z', 'z' или '*' в zero_suppression, которые были отображены как избыточные цифры.
3.
Каждый символ слева от самого левого символа, заменённого по правилу 1 выше, заменяется на:
символ пробела, если символ подавления нулей — 'Z' или 'z', или
символ заполнения, если символ подавления нулей — '*'.
4.
Возникает ошибка форматирования, если после замены по правилу 1 остаются избыточные цифры после всех 'Z', 'z' и '*' в zero_suppression; отформатированная выходная строка не создается.
Экземпляр RHS_sign отображается как символ или строка, как показано в таблице F-1.
Экземпляр floating_LHS_sign отображается как строка, полученная следующим образом.
1.
Все, кроме одного, из самых правых символов LHS_Sign заменяются избыточными цифрами (если таковые имеются) из integer_part отображения 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 символами пробела, добавленными слева (если экземпляр не следует за radix) или справа (если экземпляр следует за radix), где n — это разность между длиной экземпляра fixed_#_currency и Currency'Length. Возникает ошибка форматирования, если Currency'Length превышает длину экземпляра fixed_#_currency; отформатированная выходная строка не создается.
Экземпляр floating_$_currency отображается в виде строки, полученной следующим образом:
1.
Все, кроме одной правой символов '$', заменяются избыточными цифрами (если таковые имеются) из целой части отображения числа number справа от экземпляра floating_$_currency.
2.
Следующий символ слева заменяется строкой валюты.
3.
Символ context_sensitive_insertion заменяется как символ direct_insertion, если он находится справа от самого левого символа '$', замененного по правилу 1.
4.
Каждый другой символ заменяется пробелом.
5.
Возникает ошибка форматирования, если после замены по правилу 1 остались избыточные цифры; отформатированная строка не создается.
Экземпляр floating_#_currency отображается в виде строки, полученной следующим образом:
1.
Все, кроме одного правого символа '#', заменяются избыточными цифрами (если таковые имеются) из целой части отображения числа number справа от экземпляра 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 в последней позиции;
  • строка, содержащая символ Fill во всех позициях, кроме символа (если он есть), соответствующего 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