Справочник Ada 95
F.3.3 Пакет Text_IO.Editing
Пакет Text_IO.Editing предоставляет частный тип Picture с соответствующими операциями и обобщённый пакет Decimal_Output. Объект типа Picture состоит из правильно сформированной строки Picture (см. F.3.1) и логического значения, указывающего, будет ли строка отформатированного вывода содержать только пробелы при нулевом численном значении. Пакет Decimal_Output содержит подпрограммы отформатированного вывода, реализующие эффекты, определённые в F.3.2.
Статическая семантика
Библиотечный пакет Text_IO.Editing имеет следующую декларацию:
package Ada.Text_IO.Editing is
type Picture is private;
function Valid (Pic_String : in String;
Blank_When_Zero : in Boolean := False) return Boolean;
Blank_When_Zero : in Boolean := False) return Boolean;
function To_Picture (Pic_String : in String;
Blank_When_Zero : in Boolean := False)
return Picture;
Blank_When_Zero : in Boolean := False)
return Picture;
function Pic_String (Pic : in Picture) return String;
function Blank_When_Zero (Pic : in Picture) return Boolean;
function Blank_When_Zero (Pic : in Picture) return Boolean;
Max_Picture_Length : constant := implementation_defined;
Picture_Error : exception;
Default_Currency : constant String := "$";
Default_Fill : constant Character := '*';
Default_Separator : constant Character := ',';
Default_Radix_Mark : constant Character := '.';
Default_Fill : constant Character := '*';
Default_Separator : constant Character := ',';
Default_Radix_Mark : constant Character := '.';
generic
type Num is delta <> digits <>;
Default_Currency : in String := Text_IO.Editing.Default_Currency;
Default_Fill : in Character := Text_IO.Editing.Default_Fill;
Default_Separator : in Character :=
Text_IO.Editing.Default_Separator;
Default_Radix_Mark : in Character :=
Text_IO.Editing.Default_Radix_Mark;
package Decimal_Output is
function Length (Pic : in Picture;
Currency : in String := Default_Currency)
return Natural;
type Num is delta <> digits <>;
Default_Currency : in String := Text_IO.Editing.Default_Currency;
Default_Fill : in Character := Text_IO.Editing.Default_Fill;
Default_Separator : in Character :=
Text_IO.Editing.Default_Separator;
Default_Radix_Mark : in Character :=
Text_IO.Editing.Default_Radix_Mark;
package Decimal_Output is
function Length (Pic : in Picture;
Currency : in String := Default_Currency)
return Natural;
function Valid (Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency)
return Boolean;
Pic : in Picture;
Currency : in String := Default_Currency)
return Boolean;
function Image (Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark)
return String;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark)
return String;
procedure Put (File : in File_Type;
Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
procedure Put (Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
procedure Put (To : out String;
Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
end Decimal_Output;
private
... -- не указано языком
end Ada.Text_IO.Editing;
Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
end Decimal_Output;
private
... -- не указано языком
end Ada.Text_IO.Editing;
Исключение Constraint_Error возникает, если функция Image или любая из процедур Put вызывается с пустой строкой для Currency.
function Valid (Pic_String : in String;
Blank_When_Zero : in Boolean := False) return Boolean;
Blank_When_Zero : in Boolean := False) return Boolean;
Valid возвращает True, если Pic_String — это правильно сформированная строка шаблона (см. F.3.1), длина расширения которой не превышает Max_Picture_Length, и если Blank_When_Zero равно False или Pic_String не содержит '*'.
function To_Picture (Pic_String : in String;
Blank_When_Zero : in Boolean := False)
return Picture;
Blank_When_Zero : in Boolean := False)
return Picture;
To_Picture возвращает результат Picture такой, что применение функции Pic_String к этому результату даёт расширенную строку шаблона, эквивалентную Pic_String, и Blank_When_Zero, применённая к результату Picture, имеет то же значение, что и параметр Blank_When_Zero. Picture_Error возникает, если не Valid(Pic_String, Blank_When_Zero).
function Pic_String (Pic : in Picture) return String;
function Blank_When_Zero (Pic : in Picture) return Boolean;
function Blank_When_Zero (Pic : in Picture) return Boolean;
Если Pic — это To_Picture(String_Item, Boolean_Item) для некоторых String_Item и Boolean_Item, то:
- Pic_String(Pic) возвращает расширенную строку шаблона, эквивалентную String_Item, с заменой всех строчных букв на соответствующие заглавные буквы, и
- Blank_When_Zero(Pic) возвращает Boolean_Item.
Если Pic_1 и Pic_2 — объекты типа Picture, то "="(Pic_1, Pic_2) равно True, когда
- Pic_String(Pic_1) = Pic_String(Pic_2), и
- Blank_When_Zero(Pic_1) = Blank_When_Zero(Pic_2).
function Length (Pic : in Picture;
Currency : in String := Default_Currency)
return Natural;
Currency : in String := Default_Currency)
return Natural;
Length возвращает Pic_String(Pic)'Length + Currency_Length_Adjustment - Radix_Adjustment, где
- Currency_Length_Adjustment =
- Currency'Length - 1, если в Pic_String(Pic) есть символ '$', и
- 0 в противном случае.
- Radix_Adjustment =
- 1, если в Pic_Str(Pic) есть символ 'V' или 'v', и
- 0 в противном случае.
function Valid (Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency)
return Boolean;
Pic : in Picture;
Currency : in String := Default_Currency)
return Boolean;
Valid возвращает True, если Image(Item, Pic, Currency) не вызывает Layout_Error, и False в противном случае.
function Image (Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark)
return String;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark)
return String;
Image возвращает строку отформатированного вывода, как определено в F.3.2 для Item, Pic_String(Pic), Blank_When_Zero(Pic), Currency, Fill, Separator и Radix_Mark. Если эти правила указывают на ошибку макета, то Image вызывает исключение Layout_Error.
procedure Put (File : in File_Type;
Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
procedure Put (Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
procedure Put (Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
Каждая из этих процедур Put выводит Image(Item, Pic, Currency, Fill, Separator, Radix_Mark) в соответствии с соглашениями для Put для других вещественных типов в случае ограниченной длины строки (см. A.10.6, «Процедуры Get и Put»).
procedure Put (To : out String;
Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
Item : in Num;
Pic : in Picture;
Currency : in String := Default_Currency;
Fill : in Character := Default_Fill;
Separator : in Character := Default_Separator;
Radix_Mark : in Character := Default_Radix_Mark);
Put копирует Image(Item, Pic, Currency, Fill, Separator, Radix_Mark) в заданную строку, выравнивая по правому краю. В противном случае незаполненные значения Character в To присваиваются символу пробела. Если To'Length меньше длины строки, полученной из Image, то возникает Layout_Error.
Требования к реализации
Max_Picture_Length должен быть не менее 30. Реализация должна поддерживать строки валют длиной не менее 10 символов, как для Default_Currency в экземпляре Decimal_Output, так и для Currency при вызове Image или любой из процедур Put.
ПРИМЕЧАНИЯ
4 Правила отформатированного вывода основаны на COBOL (ANSI X3.23:1985, одобренном ISO как ISO 1989-1985), с последующими различиями:
- В Ada отсутствуют положения COBOL для локализации строки шаблона и формата 'P'.
- Следующие возможности Ada отсутствуют в COBOL:
- размещение символа валюты после числа,
- локализация отформатированной выходной строки для значений многосимвольных денежных строк, включая поддержку как сохранения длины, так и расширения длины знаков валюты в строках шаблонов
- локализация разделителя десятичных знаков, разделителя цифр и заполняющего символа, а также
- установка скобок для отрицательных значений.
Значение 30 для Max_Picture_Length соответствует тому же пределу, что и в COBOL.