diff --git a/src/lib/format.pl b/src/lib/format.pl index 96266c5d..62a9e93e 100644 --- a/src/lib/format.pl +++ b/src/lib/format.pl @@ -285,36 +285,12 @@ cells([~|Fs0], Args0, Tab, Es, VNs) --> cells(Fs, Args, 0, [], VNs). cells([~,s|Fs], [Arg|Args], Tab, Es, VNs) --> !, cells(Fs, Args, Tab, [chars(Arg)|Es], VNs). -cells([~,f|Fs], [Arg|Args], Tab, Es, VNs) --> !, - { G = format_number_chars(Arg, Chars) }, - cells(Fs, Args, Tab, [chars(Chars),goal(G)|Es], VNs). +cells([~,f|Fs], Args, Tab, Es, VNs) --> !, + cells([~,'6',f|Fs], Args, Tab, Es, VNs). cells([~|Fs0], Args0, Tab, Es, VNs) --> { numeric_argument(Fs0, Num, [f|Fs], Args0, [Arg|Args]) }, !, - { G = (format_number_chars(Arg, Cs0), - phrase(upto_what(Bs, .), Cs0, Cs), - ( Num =:= 0 -> Chars = Bs - ; ( Cs = ['.'|Rest] -> - length(Rest, L), - ( Num < L -> - length(Ds, Num), - append(Ds, _, Rest) - ; Num =:= L -> - Ds = Rest - ; Num > L, - Delta is Num - L, - % we should look into the float with - % greater accuracy here, and use the - % actual digits instead of 0. - length(Zs, Delta), - maplist(=('0'), Zs), - append(Rest, Zs, Ds) - ) - ; length(Ds, Num), - maplist(=('0'), Ds) - ), - append(Bs, ['.'|Ds], Chars) - )) }, + { G = phrase(float_with_n_decimal_digits(Arg, Num), Chars) }, cells(Fs, Args, Tab, [chars(Chars),goal(G)|Es], VNs). cells([~,r|Fs], Args, Tab, Es, VNs) --> !, cells([~,'8',r|Fs], Args, Tab, Es, VNs). @@ -369,9 +345,18 @@ cells(Fs0, Args, Tab, Es, VNs) --> Fs1 = [_|_] }, cells(Fs, Args, Tab, [chars(Fs1)|Es], VNs). -format_number_chars(N0, Chars) :- - N is N0, % evaluate compound expression - number_chars(N, Chars). +float_with_n_decimal_digits(F, N) --> + { Fr is abs(float_fractional_part(F)), + FrR0 is round(Fr*10^N), + I0 is truncate(F), + ( FrR0 >= 10^N + -> I is I0+truncate(sign(F)), FrR = FrR0 + ; I = I0, FrR is FrR0+10^N + ) + }, + ( { I=0, F<0, FrR>10^N } -> "-0" ; { number_chars(I, Is) }, seq(Is) ), + ".", + ( { FrR = 1 } -> "0" ; { number_chars(FrR, ['1'|FrRs]) }, seq(FrRs) ). n_newlines(N0) --> { N0 > 0, N is N0 - 1 }, [newline], n_newlines(N). n_newlines(0) --> []. @@ -595,6 +580,7 @@ portray_clause_(Term) --> literal(Lit, VNs) --> { write_term_to_chars(Lit, [quoted(true),variable_names(VNs),double_quotes(true)], Ls) }, ( { nonvar(Lit), + \+ number(Lit), functor(Lit, F, A), current_op(Pri, _, F), ( A =:= 0