【问题标题】:Writing formatted text in SWI-Prolog在 SWI-Prolog 中编写格式化文本
【发布时间】:2011-10-04 01:42:08
【问题描述】:

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

有什么想法吗?

非常感谢!

【问题讨论】:

    标签: prolog


    【解决方案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)).
    

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

    【讨论】:

    • 谢谢!抱歉回复缓慢,但您的回答似乎确实解决了我的问题。我不完全理解您对“test(indent)”或 sheet_inventory 所做的一切,但您的格式示例比 SWI-Prolog 页面上的示例要好得多。我现在可以实现我想要的:format('~t~3f~10|~n ~t~3f~10|', [34.34346, 112.1])
    猜你喜欢
    • 2012-09-08
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2016-09-05
    • 2016-09-03
    相关资源
    最近更新 更多