]> Repositorios git - scryer-prolog.git/commitdiff
ADDED: format specifier ~NU, using underscores to separate groups of digits
authorMarkus Triska <[email protected]>
Mon, 10 Jan 2022 15:07:05 +0000 (16:07 +0100)
committerMarkus Triska <[email protected]>
Mon, 10 Jan 2022 15:07:05 +0000 (16:07 +0100)
Example:

    ?- format("~2U", [10^12]).
    %@ 10_000_000_000.00   true.

src/lib/format.pl

index 3fd28fb673622f84646d0695436f9a445a3e03de..e28ad05ea1095cdc10f7d4e5c5d2e93c3c026679 100644 (file)
@@ -1,5 +1,5 @@
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   Written 2020, 2021 by Markus Triska ([email protected])
+   Written 2020, 2021, 2022 by Markus Triska ([email protected])
    Part of Scryer Prolog.
 
    This library provides the nonterminal format_//2 to describe
@@ -28,6 +28,7 @@
            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.
@@ -200,14 +201,12 @@ cells([~|Fs0], Args0, Tab, Es, VNs) -->
 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).
@@ -312,12 +311,22 @@ Cs = [a,b,c], Rest = [~,t,e,s,t].
 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 == [] } -> []