/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Part of Scryer Prolog.
This library provides the nonterminal format_//2 to describe
if N is 0 or omitted, no decimal point is used.
~ND like ~Nd, separating digits to the left of the decimal point
in groups of three, using the character "," (comma)
+ ~NU like ~ND, using "_" (underscore) to separate groups of digits
~Nr where N is an integer between 2 and 36: format the
next argument, which must be an integer, in radix N.
The characters "a" to "z" are used for radices 10 to 36.
cells([~|Fs0], Args0, Tab, Es, VNs) -->
{ numeric_argument(Fs0, Num, ['D'|Fs], Args0, [Arg|Args]) },
!,
- { number_chars(Num, NCs),
- phrase(("~",seq(NCs),"d"), FStr),
- phrase(format_(FStr, [Arg]), Cs0),
- phrase(upto_what(Bs0, .), Cs0, Ds),
- reverse(Bs0, Bs1),
- phrase(groups_of_three(Bs1), Bs2),
- reverse(Bs2, Bs),
- append(Bs, Ds, Cs) },
+ { separate_digits_fractional(Arg, ',', Num, Cs) },
+ cells(Fs, Args, Tab, [chars(Cs)|Es], VNs).
+cells([~|Fs0], Args0, Tab, Es, VNs) -->
+ { numeric_argument(Fs0, Num, ['U'|Fs], Args0, [Arg|Args]) },
+ !,
+ { separate_digits_fractional(Arg, '_', Num, Cs) },
cells(Fs, Args, Tab, [chars(Cs)|Es], VNs).
cells([~,i|Fs], [_|Args], Tab, Es, VNs) --> !,
cells(Fs, Args, Tab, Es, VNs).
Cs = [a,b,c], Rest = [].
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+separate_digits_fractional(Arg, Sep, Num, Cs) :-
+ number_chars(Num, NCs),
+ phrase(("~",seq(NCs),"d"), FStr),
+ phrase(format_(FStr, [Arg]), Cs0),
+ phrase(upto_what(Bs0, .), Cs0, Ds),
+ reverse(Bs0, Bs1),
+ phrase(groups_of_three(Bs1,Sep), Bs2),
+ reverse(Bs2, Bs),
+ append(Bs, Ds, Cs).
+
upto_what([], W), [W] --> [W], !.
upto_what([C|Cs], W) --> [C], !, upto_what(Cs, W).
upto_what([], _) --> [].
-groups_of_three([A,B,C,D|Rs]) --> !, [A,B,C], ",", groups_of_three([D|Rs]).
-groups_of_three(Ls) --> seq(Ls).
+groups_of_three([A,B,C,D|Rs], Sep) --> !, [A,B,C,Sep], groups_of_three([D|Rs], Sep).
+groups_of_three(Ls, _) --> seq(Ls).
cell(From, To, Es0) -->
( { Es0 == [] } -> []