string – 有没有办法在Ada中格式化文本输出

前端之家收集整理的这篇文章主要介绍了string – 有没有办法在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

如果我用C语言编程,我会做类似的事情

printf("%10s | %11s | %20s | %4d-%2d-%2d\n",name,phone,address,year,month,day);

是否有可能在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;

这将强制执行固定长度字段,这将允许截断长字符串,或者将后续条目移动到下一行. 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);

Ada中的文本IO通常很麻烦,但通常具有使您正在做的事情相对清晰的优点.

猜你在找的HTML相关文章