1:- module(tidylog_number_decimal, [decimal//1]). 2
4
5:- use_module(library(tidylog/common), [ parsing//0
6 , when_generating//1
7 , when_parsing//1
8 ]). 9
10
11decimal(N) -->
12 parsing,
13 !,
14 ( "-", decimal_(M), { N is -M }
15 ; decimal_(N)
16 ).
17decimal(N) -->
18 19 { integer(N) },
20 ( { N < 0 }, "-", { M is -N }, decimal_(M)
21 ; decimal_(N)
22 ).
23
25decimal_(N) -->
26 when_generating(decimal_codes(N,[Code|Codes])),
27
28 digit(Code),
29 digits(Codes),
30
31 when_parsing(decimal_codes(N,[Code|Codes])).
32
33
34digit(C) -->
35 [C],
36 { between(0'0,0'9,C) }.
37
38
39digits([Sep,Code|Codes]) -->
40 separator(Sep),
41 digit(Code),
42 digits(Codes).
43digits([Code|Codes]) -->
44 digit(Code),
45 digits(Codes).
46digits([]) -->
47 [].
55decimal_codes(N,Codes) :-
56 integer(N),
57 !,
58 format(codes(Codes),"~3I",[N]).
59decimal_codes(N,Codes) :-
60 nonvar(Codes),
61 name(N,Codes),
62 integer(N).
63
64
65separator(C) -->
66 [C],
67 { separator_char(C) }.
68
69
70separator_char(0'_).
71separator_char(0'\s)