我在 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/