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

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 равно нулю, то строка отформатированного выходного значения состоит из всех пробельных символов. В противном случае строка маски обрабатывается как последовательность экземпляров синтаксических категорий на основе правил в F.3.1, а строка отформатированного выходного значения является конкатенацией строковых значений, полученных из этих категорий в соответствии со следующими правилами сопоставления.
Таблица F-1 показывает сопоставление между символом управления знаком и соответствующим символом или строкой в отформатированном выводе. В столбцах, показывающих отформатированный вывод, строчная буква «b» представляет пробельный символ. Если нет символа управления знаком, но значение Item отрицательно, возникает ошибка форматирования, и строка отформатированного выходного значения не генерируется.
Таблица F-1: Отформатированный вывод для символов управления знаком
Символ управления знаком Отформатированный вывод для
Неотрицательного числа
Отформатированный вывод для
Отрицательного числа
'+' '+' '-'
'-' ' ' '-'
'<' ' ' '('
'>' ' ' ')'
"CR" " " "CR"
"DB" " " "DB"
Экземпляр fixed_LHS_sign сопоставляется с символом, как показано в таблице F-1.
Экземпляр fixed_$_char сопоставляется со строкой валюты.
Экземпляр direct_insertion сопоставляется с Separator, если direct_insertion = '_', и с символом direct_insertion в противном случае.
Экземпляр number сопоставляется со строкой целая_часть & десятичная_часть & дробная_часть, где:
  • Строка для целая_часть получается следующим образом:
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; если такого экземпляра нет, то происходит ошибка форматирования, и строка отформатированного выходного значения не генерируется.
  • десятичная_часть:
  • "" если number не включает десятичную_точку, если десятичная_точка = 'V' или если десятичная_точка = 'v'
  • Radix_Mark, если number включает '.' как десятичная_точка
  • Строка для дробная_часть получается следующим образом:
1.
Вхождения '9' в aft_digits 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', или
  • символ заполнения, если символ подавления нулей '*'.
4.
Возникает ошибка форматирования, если после замены всех символов 'Z', 'z' и '*' в zero_suppression согласно правилу 1 остаются избыточные цифры; строка отформатированного выходного значения не генерируется.
Экземпляр 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 пробелами слева (если экземпляр не содержит radix) или справа (если экземпляр содержит radix), где n — разница между длиной экземпляра fixed_#_currency и длиной Currency. Возникает ошибка форматирования, если длина Currency превышает длину экземпляра fixed_#_currency; отформатированная строка не создаётся.
Экземпляр floating_$_currency отображается как строка, полученная следующим образом:
1.
Все, кроме одного, правых символов '$' заменяются лишними цифрами (если таковые имеются) из целой части отображения числа number справа от экземпляра floating_$_currency.
2.
Следующий символ слева заменяется строкой Currency.
3.
Символ context_sensitive_insertion заменяется как символ direct_insertion, если он находится справа от самого левого символа '$', заменённого по правилу 1.
4.
Все остальные символы заменяются пробелами.
5.
Возникает ошибка форматирования, если после замены по правилу 1 остаются лишние цифры; отформатированная строка не создаётся.
Экземпляр floating_#_currency отображается как строка, полученная следующим образом:
1.
Все, кроме одного, правых символов '#' заменяются лишними цифрами (если таковые имеются) из целой части отображения числа number справа от экземпляра 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