Руководство по Ada (Ada 2022)
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
with Nonblocking, Global => in out synchronized is
with Nonblocking, Global => in out synchronized 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 := определяемое_реализацией;
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)
with Nonblocking => False;
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)
with Nonblocking => False;
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)
with Nonblocking => False;
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)
with Nonblocking => False;
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 является корректно сформированной строкой Picture (см. F.3.1), длина расширения которой не превышает Max_Picture_Length, и если либо Blank_When_Zero ложно, либо 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 к этому результату даёт расширенную строку Picture, эквивалентную 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) возвращает расширенную строку Picture, эквивалентную String_Item, и с заменой любой строчной буквы соответствующей заглавной формой, и
Blank_When_Zero(Pic) возвращает Boolean_Item.
Если Pic_1 и Pic_2 являются объектами типа Picture, то "="(Pic_1, Pic_2) истинно, когда
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) в заданную строку, выравнивая по правому краю. В противном случае неназначенные символы в To присваиваются пробелу. Если To'Length меньше длины строки, полученной в результате Image, то возникает Layout_Error.
Требования к реализации
Max_Picture_Length должен быть не менее 30. Реализация должна поддерживать строки валют длиной до как минимум 10 символов, как для Default_Currency в экземпляре Decimal_Output, так и для Currency в вызове Image или любой из процедур Put.