我在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(对齐)的功能与格式相结合的方法(舍入和零显示)。
有什么想法吗?
非常感谢!
答案 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