summaryrefslogtreecommitdiff
path: root/graphics/pgf/contrib/pgf-periodictable/pgfPT.formatNumbers.tex
blob: 5378eea470083a45dec5ef8e31d849233114116a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
% --------------------------------------------------------------------------------------------------
% subfile of pgf-PeriodicTable package ----------------------------------------------------------
% --------------------------------------------------------------------------------------------------
% «format a number to a specific number of decimal places, performing rounding» ----------
% --------------------------------------------------------------------------------------------------
\def\pgfPT@dot{.}%
\def\pgfPT@nove{9}%
\def\pgfPT@minus{-}%
\def\pgfPT@has@minus#1{\expandafter\pgfPT@test@has@minus#1\relax}%
\def\pgfPT@test@has@minus#1#2\relax{%
\edef\pgfPT@test{#1}\ifx\pgfPT@test\pgfPT@minus\relax%
\edef\pgfPT@num@sign{-}\edef\pgfPT@thenum{#2}%
\else%
\edef\pgfPT@num@sign{}\edef\pgfPT@thenum{#1#2}%
\fi}%
% --------------------------------------------------------------------------------------------------
% \pgfPT@formatnumber{decimal places}{number}
\def\pgfPT@formatnumber#1#2{%
\ifx#2\@empty\relax\else%
\ifnum#1=-1\relax#2% print the number as-is
\else%
\pgfPT@counta=0\pgfPT@countb=0\pgfPT@countc=0\pgfPT@countd=0\pgfPT@tempfalse\pgfPT@foundfalse%
\edef\pgfPT@digits@todot{}\edef\pgfPT@digits@afterdot{}%
\pgfPT@has@minus{#2}%
\expandafter\pgfPT@numberdecompose\pgfPT@thenum\relax%
\ifnum\pgfPT@countb>#1\relax%
\pgfPT@countc=\pgfPT@countb\advance\pgfPT@countc by -#1%
\edef\pgfPT@digits@toround{\pgfPT@digits@todot\pgfPT@digits@afterdot}%
\pgfPT@temptrue\expandafter\pgfPT@str@invert\pgfPT@digits@toround\relax%
\pgfPT@temptrue\expandafter\pgfPT@number@round\pgfPT@digits@toround\relax%
\pgfPT@temptrue\expandafter\pgfPT@str@gobbleN\pgfPT@digits@toround\relax%
\pgfPT@temptrue\expandafter\pgfPT@str@invert\pgfPT@digits@toround\relax%
\pgfPT@counte=#1%
\pgfPT@temptrue\expandafter\pgfPT@str@insertdot\pgfPT@digits@toround\relax%
\fi%
{\pgfPT@num@sign\pgfPT@digits@todot\ifnum#1>0\relax\ifpgfPT@found.\fi\fi\pgfPT@digits@afterdot}%
\fi\fi%
}%
% --------------------------------------------------------------------------------------------------
\def\pgfPT@number@round#1#2\relax{%
\def\pgfPT@testa{#1}\def\pgfPT@testb{#2}%
\ifpgfPT@temp\edef\pgfPT@digits@toround{}\pgfPT@countf=0\pgfPT@counte=0\pgfPT@tempfalse\fi%
\ifnum\pgfPT@counte<\pgfPT@countc\relax%
\ifx\pgfPT@testa\pgfPT@nove%
\edef\pgfPT@digits@toround{\pgfPT@digits@toround0}\pgfPT@countf=1%
\else%
\pgfPT@num=#1\relax%
\ifnum\pgfPT@countf=1\relax\advance\pgfPT@num by 1\pgfPT@countf=0\fi%
\ifnum\pgfPT@num>4\relax\pgfPT@countf=1\fi%
\edef\pgfPT@digits@toround{\pgfPT@digits@toround\the\pgfPT@num}%
\fi%
\advance\pgfPT@counte by1%
\else%
\ifx\pgfPT@testa\pgfPT@nove%
\ifnum\pgfPT@countf=1\relax%
\edef\pgfPT@digits@toround{\pgfPT@digits@toround0}\pgfPT@countf=1%
\else%
\edef\pgfPT@digits@toround{\pgfPT@digits@toround9}\pgfPT@countf=0%
\fi%
\else%
\pgfPT@num=#1\relax%
\ifnum\pgfPT@countf=1\relax\advance\pgfPT@num by 1\pgfPT@countf=0\fi%
\edef\pgfPT@digits@toround{\pgfPT@digits@toround\the\pgfPT@num}%
\fi%
\fi%
\ifx\pgfPT@testb\pgfPT@relax%
\ifnum\pgfPT@countf=1\relax%
\advance\pgfPT@countd by1%
\edef\pgfPT@digits@toround{\pgfPT@digits@toround1}%
\fi%
\else\pgfPT@number@round#2\relax\fi%
}%
% --------------------------------------------------------------------------------------------------
\def\pgfPT@str@insertdot#1#2\relax{%
\def\pgfPT@testa{#1}\def\pgfPT@testb{#2}%
\ifpgfPT@temp\edef\pgfPT@digits@todot{}\edef\pgfPT@digits@afterdot{}\pgfPT@countf=0\pgfPT@tempfalse\pgfPT@foundfalse\fi%
\ifpgfPT@found%
\ifnum\pgfPT@counte=0\relax\edef\pgfPT@digits@afterdot{}\else%
\ifnum\pgfPT@countf=\pgfPT@counte\relax%
\edef\pgfPT@testb{\pgfPT@relax}%
\else%
\edef\pgfPT@digits@afterdot{\pgfPT@digits@afterdot#1}%
\fi%
\fi%
\else%
\ifnum\pgfPT@countf=\pgfPT@countd\relax\pgfPT@foundtrue\edef\pgfPT@digits@afterdot{\pgfPT@digits@afterdot#1}\pgfPT@countf=0\relax%
\else\edef\pgfPT@digits@todot{\pgfPT@digits@todot#1}\fi%
\fi%
\advance\pgfPT@countf by 1%
\ifx\pgfPT@testb\pgfPT@relax\else\pgfPT@str@insertdot#2\relax\fi%
}%
% --------------------------------------------------------------------------------------------------
\def\pgfPT@numberdecompose#1#2\relax{%
\def\pgfPT@testa{#1}\def\pgfPT@testb{#2}%
\ifpgfPT@temp%
\edef\pgfPT@digits@afterdot{\pgfPT@digits@afterdot#1}%
\advance\pgfPT@countb by1%
\else%
\ifx\pgfPT@testa\pgfPT@dot\pgfPT@temptrue\pgfPT@foundtrue\advance\pgfPT@counta by-1\else%
\edef\pgfPT@digits@todot{\pgfPT@digits@todot#1}\advance\pgfPT@countd by1\fi\fi%
\advance\pgfPT@counta by1%
\ifx\pgfPT@testb\pgfPT@relax\else\pgfPT@numberdecompose#2\relax\fi%
}%
% --------------------------------------------------------------------------------------------------
\def\pgfPT@str@invert#1#2\relax{\def\pgfPT@testa{#1}\def\pgfPT@testb{#2}%
\ifpgfPT@temp\edef\pgfPT@digits@toround{}\pgfPT@tempfalse\fi%
\edef\pgfPT@digits@toround{#1\pgfPT@digits@toround}%
\ifx\pgfPT@testb\pgfPT@relax{}\else\pgfPT@str@invert#2\relax\fi%
}%
% --------------------------------------------------------------------------------------------------
\def\pgfPT@str@gobbleN#1#2\relax{%
\def\pgfPT@testa{#1}\def\pgfPT@testb{#2}%
\ifpgfPT@temp\edef\pgfPT@digits@toround{}\pgfPT@counte=0\pgfPT@tempfalse\fi%
\ifnum\pgfPT@counte<\pgfPT@countc\relax%
\advance\pgfPT@counte by 1%
\edef\pgfPT@digits@toround{#2}\expandafter\pgfPT@str@gobbleN#2\relax%
\fi%
}%
\endinput%