Hea*_*ece 7 string format text ada
有没有办法格式化输出的字符串?我正在尝试获得以下输出的漂亮视图
1: Ashley | 01033438392 | Wellington, New Zealand | 1987- 4-14
2: Aloha | 01087651234 | Hawaii, United States of America | 1988- 9-23
3: Jack | 01082840184 | Beijing, China | 1989- 6-19
Run Code Online (Sandbox Code Playgroud)
如果我用C语言编程,我会做类似的事情
printf("%10s | %11s | %20s | %4d-%2d-%2d\n",name,phone,address,year,month,day);
Run Code Online (Sandbox Code Playgroud)
在Ada 05中可以进行这种格式化吗?
PS请忽略姓名,电话号码,地址和生日.我在30秒内完成了它们......
它可以做到,但机制有点麻烦,而且相当冗长.
我通常会做的是编写单独的过程来处理更复杂的输出,例如日期,并使用其余的字符串处理来清楚.
package Integer_IO is new Ada.Text_IO.Integer_IO (Integer);
procedure Output_Date ( Day : in Integer; Month: in Integer; Year: in Integer) is
begin
Integer_IO.Put(Item => Day, Width => 2);
Text_IO.Put("-");
Integer_IO.Put(Item => Month, Width => 2);
Text_IO.Put("-");
Integer_IO.Put(Item => Year, Width => 4);
end Output_Date;
procedure Output_String ( Item : in String;
Width : in Integer;
Separator : in String := "|";
Truncate : Boolean := False) is
Field_Index : Integer := Text_IO.Col;
begin
if Item'length > Width and Truncate then
Text_IO.Put(Item(1..Width) & Separator);
else
Text_IO.Put(Item) & Separator;
end if;
Text_IO.Set_Col ( Field_Index + Width + 1 );
end Output_String;
Run Code Online (Sandbox Code Playgroud)
这将强制执行固定长度字段,这将允许截断长字符串,或者将后续条目移动到下一行.Set_Col将设置下一次写入的行位置,如果当前写入位置已超过请求的位置,则可能将其置于下一行.
我把字符串截断作为一个机会使用数组切片和Text_IO的输出操作,但我通常不是默认截断的粉丝,因为允许字符串超出请求的宽度或下一行缩进往往会使格式错误更多明显.
因此,根据上面的代码,打印出类似于第一行的内容,可能类似于:
Name : String := "Ashley"
Phone : String := "01033438392"
Address: String := "Wellington, New Zealand"
Day : Integer := 14;
Month : Integer := 4;
Year : Integer := 1987;
Output_String(Item=> Name, Width => 10);
Output_String(Item=> Phone, Width => 11);
Output_String(Item=> Address, Width => 20);
Output_Date(Day,Month,Year);
Run Code Online (Sandbox Code Playgroud)
Ada中的文本IO通常很麻烦,但通常具有使您正在做的事情相对清晰的优点.