有没有办法在 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秒就把它们编好了...
Is there a way to format the string being outputted?
I'm trying get a pretty view of the following output
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
If I was programming in C, I would do something like
printf("%10s | %11s | %20s | %4d-%2d-%2d\n",name,phone,address,year,month,day);
Would it be possible to do this kind of formatting in Ada 05?
PS Please just ignore the names, phone numbers, address, and birthdate. I made them up in like 30 seconds...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
这是可以做到的,但机制有点麻烦,而且比较冗长。
我通常会做的是编写单独的过程来处理更复杂的输出,例如日期,并将其与其余的字符串处理一起使用以保持清晰。
这将强制执行固定长度字段,这将选择性地允许截断长字符串,或者将后续条目移动到下一行。 Set_Col 将设置下一次写入的行位置,如果当前写入位置已经超过请求的位置,则可能将其放置在下一行。
我在那里添加了字符串截断,作为使用数组切片和 Text_IO 输出操作的机会,但我一般不喜欢默认截断,因为允许字符串超出请求的宽度或在下一行缩进往往会导致格式错误更多明显的。
因此,根据上面的代码,打印出类似于第一行的内容可能类似于:
Ada 中的 Text IO 通常很麻烦,但通常具有使您正在做的事情相对清晰的优点。
It can be done, but the mechanisms are a bit cumbersome and quite a bit more verbose.
What I would generally do is write separate procedures to handle your more complicated output, e.g. dates and use that with the rest of the string handling for clarity.
This will enforce fixed length fields, which will optionally allow truncation of long strings, or else move subsequent entries onto the next line. Set_Col will set the line position for the next write, potentially placing it on the next line if the current write position has already exceeded the one requested.
I threw string truncation in there as a chance to use array slicing and Text_IO's output manipulation, but I'm not generally a fan of default truncation, as allowing the string to overrun the requested width or indenting on the next line tend make formatting errors more obvious.
So printing out something like your first line, given the code above, might look something like:
Text IO in Ada is usually cumbersome, but generally has the virtue of making what you are doing relatively clear.
对于这种特定的格式设置有辅助工具。
包 Ada.Text_IO.Integer_IO
放置一个字段
Item
右对齐,空白字符作为填充符。其中Width
是字段宽度,Base
默认为 10。包 Ada.Strings.Fixed
返回格式化的细绳。其中
Count
是字段宽度,Pad
是字段的填充符。Head
将字符串左对齐。Tail
将字符串右对齐。让列宽为 8 个字符长并使用破折号作为填充符。
输出
属性discrete_type'Width
返回一个长度, 离散类型需要表示为文本。
示例
输出
我建议为电话号码创建一个类型,我不知道它应该是带有标题零的字符串还是数字,我猜电话号码可以有不同的长度。
There is auxiliary tools for this particular format setup.
Package Ada.Text_IO.Integer_IO
Puts a field with
Item
aligned to right and white-space character as filler. WhereWidth
is field width andBase
is 10 as defualt.Package Ada.Strings.Fixed
Returns a formatted string. Where
Count
is the field width andPad
is filler for the field.Head
aligns string to left.Tail
aligns string to right.Let column width be 8 character long and use dash as filler.
Output
Attribute discrete_type'Width
Returns a length which the discrete type requires to be represented as text.
Example
Output
I would recommend to create a type for a phone number, I dunno if it should be string or number with the about of heading zeros, phone number can have different length I guess.
请注意,如今在 C++ 中,
printf()
正处于被贬值的边缘,转而使用带有流格式化程序的流。它很方便,但非常不安全(至少在这个词的几种意义上)。如今,开发人员被鼓励使用 C++ 流(及其各种操纵器)。在 Ada 中,您可以使用字符串连接运算符
&
以与 C++ 流非常相似的方式操作字符串,而 C++ 人员使用流插入运算符 (<<
)。在某些方面,Ada 的方法更好,因为您可以嵌套连接表达式,而流插入表达式则无法做到这一点。这里的问题是,没有任何方便的 C++ 格式化程序的等效项,例如
setfill()
、hex
和setw()
。确实应该有,并且(hex
除外)您自己编写它们并不难,但目前它们还不存在。例如,
setw()/setfill()
等效项类似于:如果您确实想要一个
printf()
接口,则printf()
当然可以从 Ada 调用。您必须担心 Ada 的大小字符串和 C 的 nul 终止字符串之间的转换,但这就是Ada.Interfaces.C.Strings
的用途。Note that in C++ these days
printf()
is on the verge of being depreciated, in favor of using streams with stream formatters. It is convenient, but massively unsafe (in at least a couple senses of the word). These days developers are encouraged to use C++ streams (with their assorted manipulators) instead.In Ada you can manipulate strings in a very similar style to C++ streams using the string catenation operator
&
where C++ folks use the stream insertion operator (<<
). In some ways, Ada's method is better because you can nest catenated expressions, which you can't do with stream-inserted expressions.The problem here is that there aren't any handy equivalents to the C++ formatters like
setfill()
,hex
, andsetw()
. There really ought to be, and (hex
excepted) they aren't tough to write yourself, but for now they don't exist.For example, a
setw()/setfill()
equivalent would be something like:If you really want a
printf()
interface,printf()
is quite callable from Ada of course. You have to worry about transitioning between Ada's sized strings and C's nul-terminated strings, but that's whatAda.Interfaces.C.Strings
is there for.是的,有。虽然它不像 c 中那么容易。
看看 §A.4.4 有界-长度字符串处理了解如何创建预定义大小的字符串,并使用整数'image 来转换数字。的&运算符对于使用 ada.text_io.put_line() 连接字符串和输出非常有用。
Yes there is. Although its not as easy as in c.
Have a look at §A.4.4 Bounded-Length String Handling for how to create strings of a predefined size, and use integer'image to convert your numbers. The & operator is useful to concatenate strings and output using ada.text_io.put_line().
您还可以使用
GNAT.Formatted_String
包。它至少适用于 Ada 2012(无法检查它是否存在于 Ada 2005 中)。
它与 printf 的用法非常相似,但在语法上略有不同。
这是一个简单的工作示例http://tpcg.io/iJwfWa:
输出:
另一个带有输入的示例< a href="http://tpcg.io/iJwfWa" rel="nofollow noreferrer">http://tpcg.io/iJwfWa :
输出:
gnat 提供的
g-forstr.ads
文件中给出了最好的示例:You can also use the
GNAT.Formatted_String
package.It works at least with Ada 2012 (can't check if it exists in Ada 2005).
It is very similar to printf usage, but with a slight syntactical difference.
Here is a working simple example http://tpcg.io/iJwfWa :
Output :
Another example with your inputs http://tpcg.io/iJwfWa :
Outputs:
Best example is given in the
g-forstr.ads
file provided with gnat :您可能会喜欢这个使用
Ada.Strings.Fixed
进行格式化这ASCII 图表的范围轴标签。请参阅function Label
,它使用Tail
和Trim
来格式化Lower< 的
Integer'Image
/code> 和上限
值。代码:
控制台:
You might like this simple card game simulation that uses
Ada.Strings.Fixed
to format the range axis labels for an ASCII graph. Seefunction Label
, which usesTail
andTrim
to format theInteger'Image
of aLower
andUpper
value.Code:
Console: