2011-10-04 41 views
1

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

我得到了同樣的問題,以及更多:

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

注「空間分配」符〜牛逼,絕對的「列寬」的位置〜|,視爲字段類型說明符。輸出:

?- 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 
+0

謝謝!對不起,答覆緩慢,但你的答案似乎解決了我的問題。我並不完全理解你用「test(indent)」或sheet_inventory的東西所做的所有事情,但你的格式化例子比SWI-Prolog頁面上的格式更好。我可以實現我現在想要的: 格式('〜t〜3f〜10 |〜n〜t〜3f〜10 |',[34.34346,112.1]) – The111

相關問題