在SWI-Prolog中编写格式化文本

时间:2011-10-04 01:42:08

标签: prolog

我在SWI-Prolog文档中花了很多时间,而且无处可去。我的愿望是能够格式化输出的数字,使我控制显示的总#十进制数字,并且右对齐给定字符宽度的数字。例如:

  2.500   (trailing zeroes displayed)
 34.432   (rounded from a much longer decimal value)
213.110

所有3个都在7个字符宽的空间中右对齐,显示3个小数位(即使它们为零)。我可以单独完成其中的一些事情,但不能一次完成。

writef( '%7R', [34.342]).
writef( '%7R', [34.300]).

^^^这非常接近我想要的,但不幸的是它确实显示任何尾随零(它总是会省略它们)。另外,在将舍入值传递给writef()之前,我必须手动进行舍入。

format( '~3f', 34.34219089).
format( '~3f', 1234.3).

这个进行舍入,并允许尾随零,但我找不到使用“格式”函数强制右对齐的方法,我找不到将writef(对齐)的功能与格式相结合的方法(舍入和零显示)。

有什么想法吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,还有更多:

[debug]  ?- format( '~3f', 34.34219089).
34,342

逗号(虽然是语言环境需要,但请注意这一点)使读回输出变得复杂。我最终得到了一些丑陋的解决方法来控制舍入:

[debug]  ?- X is round(34.34219089 * 1000) / 1000, write(X).
34.342
X = 34.342.

要填充和对齐,您应使用制表位,由成对的t|控制。文档在这个主题上有点过分合成。例如,要以电子表格默认样式打印数字表(文本左对齐,数字右对齐):

test(indent) :- nl,
    forall(member(L, [[a,    3.66,      55.5334],
              [basd, 22.876345, 2113.4465],
              [cas,  0.6623233, 53.5]
             ]),
           format('~s~t~20|~t~3f~40|~t~3f~60|~n', L)).

注意'space allocator'说明符 ~t 的位置,绝对'列宽'〜| ,关注字段类型说明符。输出:

?- run_tests(sheet_inventory:indent).
% PL-Unit: sheet_inventory:indent 
a                                  3,660              55,533
basd                              22,876            2113,447
cas                                0,662              53,500