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

标签 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(对齐)的功能与格式结合起来的方法(四舍五入和零显示)。

有什么想法吗?

非常感谢!

最佳答案

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

[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)).

请注意“空间分配器”说明符 ~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

关于prolog - 在 SWI-Prolog 中编写格式化文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7642491/

相关文章:

algorithm - Prolog程序,这个程序应该做什么?

list - 列表替换中的 Prolog 元素

list - Prolog 在列表中追加列表

prolog - XSB Prolog - 如何查阅 .p 文件?

prolog - 为什么我在 prolog 的 `length/2` 实现中得到重复的结果?

prolog - SICStus Prolog 垃圾收集跟踪消息

Prolog——如何判断两个事物是否属于同一组?

string - 在 Prolog 中计算字符串

Prolog:毕达哥拉斯三元组

Prolog 算术语法