Spec-Zone.ru › Ada 2005
Справочное руководство Ada 2005

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

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

Содержание строки отформатированного вывода основано на:
  • Значении, Item, некоторого десятичного типа Num,
  • Расширенной строке шаблона Pic_String,
  • Булевом значении Blank_When_Zero,
  • Строке валюты,
  • Символе заполнения,
  • Символе разделителя и
  • Символе разделителя десятичной запятой.
Сочетание истинного значения 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 равно нулю, то строка отформатированного вывода состоит из всех пробелов. В противном случае строка шаблона рассматривается как последовательность экземпляров синтаксических категорий на основе правил в F.3.1, и строка отформатированного вывода является конкатенацией строковых значений, полученных из этих категорий в соответствии со следующими правилами сопоставления.
Таблица F-1 показывает сопоставление символа управления знаком с соответствующим символом или строкой в отформатированном выводе. В столбцах, показывающих отформатированный вывод, строчная буква 'b' представляет пробел. Если нет символа управления знаком, но значение Item отрицательно, происходит ошибка форматирования, и строка отформатированного вывода не создается.
Таблица F-1: Отформатированный вывод для символов управления знаком
Символ управления знаком Отформатированный вывод для
Неотрицательного числа
Отформатированный вывод для
Отрицательного числа
'+' '+' '–'
'–' 'b' '–'
'<' 'b' '('
'>' 'b' ')'
"CR" "bb" "CR"
"DB" "bb" "DB"
Экземпляр fixed_LHS_sign сопоставляется с символом, как показано в таблице F-1.
Экземпляр fixed_$_char сопоставляется со строкой валюты.
Экземпляр 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. Ошибка макета возникает, если длина Currency превышает длину экземпляра fixed_#_currency; отредактированная строка вывода не создаётся.
Экземпляр floating_$_currency отображается как строка, полученная следующим образом:
1.
Все, кроме одного, правых символов '$' заменяются избыточными цифрами (если таковые имеются) из целой части отображения числа, расположенного справа от экземпляра floating_$_currency.
2.
Следующий символ слева заменяется строкой Currency.
3.
Символ context_sensitive_insertion заменяется как символ direct_insertion, если он расположен справа от самого левого символа '$', заменённого по правилу 1.
4.
Каждый другой символ заменяется пробелом.
5.
Ошибка макета возникает, если после замены по правилу 1 остаются избыточные цифры; отредактированная строка вывода не создаётся.
Экземпляр floating_#_currency отображается как строка, полученная следующим образом:
1.
Все, кроме одного, правых символов '#' заменяются избыточными цифрами (если таковые имеются) из целой части отображения числа, расположенного справа от экземпляра floating_#_currency.
2.
Подстрока, последний символ которой расположен непосредственно перед самым левым символом, заменённым по правилу 1, и длина которой равна длине Currency, заменяется строкой Currency.
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" (currency = "FF",
separator = '.',
radix mark = ',')
123456.78 Рисунок: "-$**_***_**9.99"
Результат: "b$***123 456,78"
"bFF***123.456 78" (currency = "FF",
separator = '.',
radix mark = ',')
0.0 Рисунок: "-$$$$$$.$$"
Результат: "bbbbbbbbbb"
0.20 Рисунок: "-$$$$$$.$$"
Результат: "bbbbbb$.20"
-1234.565 Рисунок: "<<<<_<<<.<<###>"
Результат: "bb(1 234,57DMb)" (currency = "DM")
12345.67 Рисунок: "###_###_##9.99"
Результат: "bbCHF12 345,67" (currency = "CHF")


Spec-Zone.ru

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