Написание форматированного текста в SWI-Prolog - PullRequest
2 голосов
/ 04 октября 2011

Я потратил значительное количество времени на документирование 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 Ответ

1 голос
/ 04 октября 2011

У меня та же проблема, и еще:

[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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...