sciform 0.38.2__py3-none-any.whl → 0.39.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sciform/api/formatter.py +3 -13
- sciform/api/global_configuration.py +0 -4
- sciform/format_utils/exp_translations.py +0 -12
- sciform/format_utils/exponents.py +13 -35
- sciform/format_utils/numbers.py +6 -45
- sciform/formatting/fsml.py +1 -6
- sciform/formatting/number_formatting.py +7 -16
- sciform/formatting/output_conversion.py +6 -17
- sciform/formatting/parser.py +39 -63
- sciform/options/finalized_options.py +0 -1
- sciform/options/global_options.py +0 -1
- sciform/options/input_options.py +0 -1
- sciform/options/option_types.py +0 -4
- sciform/options/populated_options.py +1 -3
- sciform/options/validation.py +0 -7
- {sciform-0.38.2.dist-info → sciform-0.39.0.dist-info}/METADATA +3 -4
- sciform-0.39.0.dist-info/RECORD +31 -0
- {sciform-0.38.2.dist-info → sciform-0.39.0.dist-info}/WHEEL +1 -1
- sciform-0.38.2.dist-info/RECORD +0 -31
- {sciform-0.38.2.dist-info → sciform-0.39.0.dist-info}/LICENSE +0 -0
- {sciform-0.38.2.dist-info → sciform-0.39.0.dist-info}/top_level.txt +0 -0
sciform/api/formatter.py
CHANGED
@@ -118,7 +118,6 @@ class Formatter:
|
|
118
118
|
'left_pad_dec_place': 0,
|
119
119
|
'exp_format': 'standard',
|
120
120
|
'extra_si_prefixes': {},
|
121
|
-
'extra_iec_prefixes': {},
|
122
121
|
'extra_parts_per_forms': {},
|
123
122
|
'capitalize': False,
|
124
123
|
'superscript': True,
|
@@ -153,7 +152,6 @@ class Formatter:
|
|
153
152
|
left_pad_dec_place: int | None = None,
|
154
153
|
exp_format: option_types.ExpFormat | None = None,
|
155
154
|
extra_si_prefixes: dict[int, str] | None = None,
|
156
|
-
extra_iec_prefixes: dict[int, str] | None = None,
|
157
155
|
extra_parts_per_forms: dict[int, str] | None = None,
|
158
156
|
capitalize: bool | None = None,
|
159
157
|
superscript: bool | None = None,
|
@@ -180,7 +178,6 @@ class Formatter:
|
|
180
178
|
* ``exp_val`` must be 0 for fixed point and percent modes
|
181
179
|
* ``exp_val`` must be a multiple of 3 for engineering and
|
182
180
|
shifted engineering modes
|
183
|
-
* ``exp_val`` must be a multiple of 10 for binary iec mode
|
184
181
|
|
185
182
|
* ``upper_separator`` may be any of ``['', ',', '.', ' ', '_']``
|
186
183
|
but must be different from ``decimal_separator``
|
@@ -189,13 +186,12 @@ class Formatter:
|
|
189
186
|
|
190
187
|
:param exp_mode: Specify the exponent formatting mode.
|
191
188
|
:type exp_mode: ``Literal['fixed_point', 'percent',
|
192
|
-
'scientific', 'engineering', 'engineering_shifted'
|
193
|
-
'binary_iec'] | None``
|
189
|
+
'scientific', 'engineering', 'engineering_shifted'] | None``
|
194
190
|
:param exp_val: Indicates how the exponent value should be
|
195
191
|
chosen. If an integer is specified, the value must be 0 for
|
196
192
|
fixed point and percent modes, an integer multiple of 3 for
|
197
|
-
engineering and engineering shifted modes
|
198
|
-
|
193
|
+
engineering and engineering shifted modes. Can be set to
|
194
|
+
``"auto"``.
|
199
195
|
:type exp_val: ``int | Literal['auto'] | None``
|
200
196
|
:param round_mode: Indicate how to round numbers during
|
201
197
|
formatting.
|
@@ -231,11 +227,6 @@ class Formatter:
|
|
231
227
|
values to si prefixes. Entries overwrite default values. A
|
232
228
|
value of ``None`` means that exponent will not be converted.
|
233
229
|
:type extra_si_prefixes: ``dict[int, Union[str, None]] | None``
|
234
|
-
:param extra_iec_prefixes: Dictionary mapping additional
|
235
|
-
exponent values to iec prefixes. Entries overwrite default
|
236
|
-
values. A value of ``None`` means that exponent will not be
|
237
|
-
converted.
|
238
|
-
:type extra_iec_prefixes: ``dict[int, Union[str, None]] | None``
|
239
230
|
:param extra_parts_per_forms: Dictionary mapping additional
|
240
231
|
exponent values to "parts-per" forms. Entries overwrite
|
241
232
|
default values. A value of ``None`` means that exponent will
|
@@ -297,7 +288,6 @@ class Formatter:
|
|
297
288
|
left_pad_dec_place=left_pad_dec_place,
|
298
289
|
exp_format=exp_format,
|
299
290
|
extra_si_prefixes=extra_si_prefixes,
|
300
|
-
extra_iec_prefixes=extra_iec_prefixes,
|
301
291
|
extra_parts_per_forms=extra_parts_per_forms,
|
302
292
|
capitalize=capitalize,
|
303
293
|
superscript=superscript,
|
@@ -38,7 +38,6 @@ def set_global_options( # noqa: PLR0913
|
|
38
38
|
left_pad_dec_place: int | None = None,
|
39
39
|
exp_format: option_types.ExpFormat | None = None,
|
40
40
|
extra_si_prefixes: dict[int, str] | None = None,
|
41
|
-
extra_iec_prefixes: dict[int, str] | None = None,
|
42
41
|
extra_parts_per_forms: dict[int, str] | None = None,
|
43
42
|
capitalize: bool | None = None,
|
44
43
|
superscript: bool | None = None,
|
@@ -69,7 +68,6 @@ def set_global_options( # noqa: PLR0913
|
|
69
68
|
left_pad_dec_place=left_pad_dec_place,
|
70
69
|
exp_format=exp_format,
|
71
70
|
extra_si_prefixes=extra_si_prefixes,
|
72
|
-
extra_iec_prefixes=extra_iec_prefixes,
|
73
71
|
extra_parts_per_forms=extra_parts_per_forms,
|
74
72
|
capitalize=capitalize,
|
75
73
|
superscript=superscript,
|
@@ -119,7 +117,6 @@ class GlobalOptionsContext:
|
|
119
117
|
left_pad_dec_place: int | None = None,
|
120
118
|
exp_format: option_types.ExpFormat | None = None,
|
121
119
|
extra_si_prefixes: dict[int, str] | None = None,
|
122
|
-
extra_iec_prefixes: dict[int, str] | None = None,
|
123
120
|
extra_parts_per_forms: dict[int, str] | None = None,
|
124
121
|
capitalize: bool | None = None,
|
125
122
|
superscript: bool | None = None,
|
@@ -145,7 +142,6 @@ class GlobalOptionsContext:
|
|
145
142
|
left_pad_dec_place=left_pad_dec_place,
|
146
143
|
exp_format=exp_format,
|
147
144
|
extra_si_prefixes=extra_si_prefixes,
|
148
|
-
extra_iec_prefixes=extra_iec_prefixes,
|
149
145
|
extra_parts_per_forms=extra_parts_per_forms,
|
150
146
|
capitalize=capitalize,
|
151
147
|
superscript=superscript,
|
@@ -2,15 +2,14 @@
|
|
2
2
|
|
3
3
|
from __future__ import annotations
|
4
4
|
|
5
|
-
from typing import TYPE_CHECKING
|
5
|
+
from typing import TYPE_CHECKING
|
6
6
|
|
7
7
|
from sciform.format_utils.exp_translations import (
|
8
|
-
val_to_iec_dict,
|
9
8
|
val_to_parts_per_dict,
|
10
9
|
val_to_si_dict,
|
11
10
|
)
|
12
11
|
from sciform.format_utils.numbers import (
|
13
|
-
|
12
|
+
get_mantissa_exp,
|
14
13
|
)
|
15
14
|
from sciform.options.option_types import (
|
16
15
|
ExpFormatEnum,
|
@@ -24,22 +23,13 @@ if TYPE_CHECKING: # pragma: no cover
|
|
24
23
|
|
25
24
|
def get_translation_dict(
|
26
25
|
exp_format: ExpFormatEnum,
|
27
|
-
base: Literal[10, 2],
|
28
26
|
extra_si_prefixes: dict[int, str],
|
29
|
-
extra_iec_prefixes: dict[int, str],
|
30
27
|
extra_parts_per_forms: dict[int, str],
|
31
28
|
) -> dict[int, str]:
|
32
29
|
"""Resolve dictionary of prefix translations."""
|
33
30
|
if exp_format is ExpFormatEnum.PREFIX:
|
34
|
-
|
35
|
-
|
36
|
-
translation_dict.update(extra_si_prefixes)
|
37
|
-
elif base == 2:
|
38
|
-
translation_dict = val_to_iec_dict.copy()
|
39
|
-
translation_dict.update(extra_iec_prefixes)
|
40
|
-
else:
|
41
|
-
msg = f"Unhandled base {base}"
|
42
|
-
raise ValueError(msg)
|
31
|
+
translation_dict = val_to_si_dict.copy()
|
32
|
+
translation_dict.update(extra_si_prefixes)
|
43
33
|
elif exp_format is ExpFormatEnum.PARTS_PER:
|
44
34
|
translation_dict = val_to_parts_per_dict.copy()
|
45
35
|
translation_dict.update(extra_parts_per_forms)
|
@@ -50,24 +40,21 @@ def get_translation_dict(
|
|
50
40
|
return translation_dict
|
51
41
|
|
52
42
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
def get_standard_exp_str(base: int, exp_val: int, *, capitalize: bool = False) -> str:
|
43
|
+
def get_standard_exp_str(exp_val: int, *, capitalize: bool = False) -> str:
|
57
44
|
"""Get standard (eg. 'e+02') exponent string."""
|
58
|
-
|
45
|
+
base_symbol = "e"
|
59
46
|
if capitalize:
|
60
|
-
|
61
|
-
return f"{
|
47
|
+
base_symbol = base_symbol.capitalize()
|
48
|
+
return f"{base_symbol}{exp_val:+03d}"
|
62
49
|
|
63
50
|
|
64
51
|
superscript_translate = str.maketrans("+-0123456789", "⁺⁻⁰¹²³⁴⁵⁶⁷⁸⁹")
|
65
52
|
|
66
53
|
|
67
|
-
def get_superscript_exp_str(
|
54
|
+
def get_superscript_exp_str(exp_val: int) -> str:
|
68
55
|
"""Get superscript (e.g. '×10⁺²') exponent string."""
|
69
56
|
exp_val_str = f"{exp_val}".translate(superscript_translate)
|
70
|
-
return f"×{
|
57
|
+
return f"×10{exp_val_str}"
|
71
58
|
|
72
59
|
|
73
60
|
def get_exp_str( # noqa: PLR0913
|
@@ -76,7 +63,6 @@ def get_exp_str( # noqa: PLR0913
|
|
76
63
|
exp_mode: ExpModeEnum,
|
77
64
|
exp_format: ExpFormatEnum,
|
78
65
|
extra_si_prefixes: dict[int, str],
|
79
|
-
extra_iec_prefixes: dict[int, str],
|
80
66
|
extra_parts_per_forms: dict[int, str],
|
81
67
|
capitalize: bool,
|
82
68
|
superscript: bool,
|
@@ -87,18 +73,10 @@ def get_exp_str( # noqa: PLR0913
|
|
87
73
|
if exp_mode is ExpModeEnum.PERCENT:
|
88
74
|
return "%"
|
89
75
|
|
90
|
-
if exp_mode is ExpModeEnum.BINARY or exp_mode is ExpModeEnum.BINARY_IEC:
|
91
|
-
base = 2
|
92
|
-
else:
|
93
|
-
base = 10
|
94
|
-
base = cast(Literal[10, 2], base)
|
95
|
-
|
96
76
|
if exp_format is ExpFormatEnum.PREFIX or exp_format is ExpFormatEnum.PARTS_PER:
|
97
77
|
translation_dict = get_translation_dict(
|
98
78
|
exp_format,
|
99
|
-
base,
|
100
79
|
extra_si_prefixes,
|
101
|
-
extra_iec_prefixes,
|
102
80
|
extra_parts_per_forms,
|
103
81
|
)
|
104
82
|
if (
|
@@ -110,9 +88,9 @@ def get_exp_str( # noqa: PLR0913
|
|
110
88
|
return exp_str
|
111
89
|
|
112
90
|
if superscript:
|
113
|
-
return get_superscript_exp_str(
|
91
|
+
return get_superscript_exp_str(exp_val)
|
114
92
|
|
115
|
-
return get_standard_exp_str(
|
93
|
+
return get_standard_exp_str(exp_val, capitalize=capitalize)
|
116
94
|
|
117
95
|
|
118
96
|
def get_val_unc_exp(
|
@@ -132,7 +110,7 @@ def get_val_unc_exp(
|
|
132
110
|
else:
|
133
111
|
exp_driver_val = unc
|
134
112
|
|
135
|
-
_, exp_val
|
113
|
+
_, exp_val = get_mantissa_exp(
|
136
114
|
exp_driver_val,
|
137
115
|
exp_mode=exp_mode,
|
138
116
|
input_exp=input_exp,
|
sciform/format_utils/numbers.py
CHANGED
@@ -1,10 +1,9 @@
|
|
1
|
-
"""Utilities for parsing mantissa,
|
1
|
+
"""Utilities for parsing mantissa, and exp."""
|
2
2
|
|
3
3
|
from __future__ import annotations
|
4
4
|
|
5
5
|
import re
|
6
6
|
from decimal import Decimal
|
7
|
-
from math import floor, log2
|
8
7
|
from typing import Literal
|
9
8
|
|
10
9
|
from sciform.formatting.parser import (
|
@@ -26,13 +25,6 @@ def get_top_dec_place(num: Decimal) -> int:
|
|
26
25
|
return len(digits) + exp - 1
|
27
26
|
|
28
27
|
|
29
|
-
def get_top_dec_place_binary(num: Decimal) -> int:
|
30
|
-
"""Get the decimal place of a decimal's most significant digit."""
|
31
|
-
if not num.is_finite() or num == 0:
|
32
|
-
return 0
|
33
|
-
return floor(log2(abs(num)))
|
34
|
-
|
35
|
-
|
36
28
|
def get_bottom_dec_place(num: Decimal) -> int:
|
37
29
|
"""Get the decimal place of a decimal's least significant digit."""
|
38
30
|
if not num.is_finite():
|
@@ -102,39 +94,12 @@ def get_engineering_exp(
|
|
102
94
|
return exp_val
|
103
95
|
|
104
96
|
|
105
|
-
def
|
106
|
-
num: Decimal,
|
107
|
-
input_exp: int | ExpValEnum,
|
108
|
-
*,
|
109
|
-
iec: bool = False,
|
110
|
-
) -> int:
|
111
|
-
"""Get the exponent for binary formatting modes."""
|
112
|
-
if input_exp is ExpValEnum.AUTO:
|
113
|
-
exp_val = get_top_dec_place_binary(num)
|
114
|
-
if iec:
|
115
|
-
exp_val = (exp_val // 10) * 10
|
116
|
-
else:
|
117
|
-
if iec and input_exp % 10 != 0:
|
118
|
-
msg = (
|
119
|
-
f"Exponent must be an integer multiple of 10 in binary IEC mode, not "
|
120
|
-
f"{input_exp}."
|
121
|
-
)
|
122
|
-
raise ValueError(msg)
|
123
|
-
exp_val = input_exp
|
124
|
-
return exp_val
|
125
|
-
|
126
|
-
|
127
|
-
def get_mantissa_exp_base(
|
97
|
+
def get_mantissa_exp(
|
128
98
|
num: Decimal,
|
129
99
|
exp_mode: ExpModeEnum,
|
130
100
|
input_exp: int | ExpValEnum,
|
131
|
-
) -> tuple[Decimal, int
|
132
|
-
"""Get mantissa
|
133
|
-
if exp_mode is ExpModeEnum.BINARY or exp_mode is ExpModeEnum.BINARY_IEC:
|
134
|
-
base = 2
|
135
|
-
else:
|
136
|
-
base = 10
|
137
|
-
|
101
|
+
) -> tuple[Decimal, int]:
|
102
|
+
"""Get mantissa and exponent for formatting a decimal number."""
|
138
103
|
if num == 0 or not num.is_finite():
|
139
104
|
mantissa = Decimal(num)
|
140
105
|
exp = 0 if input_exp is ExpValEnum.AUTO else input_exp
|
@@ -147,16 +112,12 @@ def get_mantissa_exp_base(
|
|
147
112
|
exp = get_engineering_exp(num, input_exp)
|
148
113
|
elif exp_mode is ExpModeEnum.ENGINEERING_SHIFTED:
|
149
114
|
exp = get_engineering_exp(num, input_exp, shifted=True)
|
150
|
-
elif exp_mode is ExpModeEnum.BINARY:
|
151
|
-
exp = get_binary_exp(num, input_exp)
|
152
|
-
elif exp_mode is ExpModeEnum.BINARY_IEC:
|
153
|
-
exp = get_binary_exp(num, input_exp, iec=True)
|
154
115
|
else:
|
155
116
|
msg = f"Unhandled exponent mode {exp_mode}."
|
156
117
|
raise ValueError(msg)
|
157
|
-
mantissa = num * Decimal(
|
118
|
+
mantissa = num * Decimal(10) ** Decimal(-exp)
|
158
119
|
mantissa = mantissa.normalize()
|
159
|
-
return mantissa, exp
|
120
|
+
return mantissa, exp
|
160
121
|
|
161
122
|
|
162
123
|
# language=pythonverboseregexp noqa: ERA001
|
sciform/formatting/fsml.py
CHANGED
@@ -18,7 +18,7 @@ pattern = re.compile(
|
|
18
18
|
|
|
19
19
|
(?P<round_mode_special>[AP])
|
20
20
|
)?
|
21
|
-
(?P<exp_mode>[fF%
|
21
|
+
(?P<exp_mode>[fF%eErR])?
|
22
22
|
(?:x(?P<exp_val>[+-]?\d+))?
|
23
23
|
(?P<prefix_mode>p)?
|
24
24
|
(?P<paren_uncertainty>\(\))?
|
@@ -46,11 +46,6 @@ def parse_exp_mode(
|
|
46
46
|
exp_mode = "engineering_shifted"
|
47
47
|
else:
|
48
48
|
exp_mode = "engineering"
|
49
|
-
elif exp_mode in ["b", "B"]:
|
50
|
-
if alternate_mode:
|
51
|
-
exp_mode = "binary_iec"
|
52
|
-
else:
|
53
|
-
exp_mode = "binary"
|
54
49
|
else:
|
55
50
|
capitalize = None
|
56
51
|
return exp_mode, capitalize
|
@@ -16,7 +16,7 @@ from sciform.format_utils.make_strings import (
|
|
16
16
|
get_sign_str,
|
17
17
|
)
|
18
18
|
from sciform.format_utils.numbers import (
|
19
|
-
|
19
|
+
get_mantissa_exp,
|
20
20
|
get_val_unc_top_dec_place,
|
21
21
|
parse_mantissa_from_ascii_exp_str,
|
22
22
|
)
|
@@ -88,7 +88,6 @@ def format_non_finite(num: Decimal, options: FinalizedOptions) -> str:
|
|
88
88
|
capitalize=options.capitalize,
|
89
89
|
superscript=options.superscript,
|
90
90
|
extra_si_prefixes=options.extra_si_prefixes,
|
91
|
-
extra_iec_prefixes=options.extra_iec_prefixes,
|
92
91
|
extra_parts_per_forms=options.extra_parts_per_forms,
|
93
92
|
)
|
94
93
|
else:
|
@@ -120,7 +119,7 @@ def format_num(num: Decimal, options: FinalizedOptions) -> str:
|
|
120
119
|
round_mode = options.round_mode
|
121
120
|
exp_mode = options.exp_mode
|
122
121
|
ndigits = options.ndigits
|
123
|
-
mantissa, temp_exp_val
|
122
|
+
mantissa, temp_exp_val = get_mantissa_exp(num, exp_mode, exp_val)
|
124
123
|
round_digit = get_round_dec_place(mantissa, round_mode, ndigits)
|
125
124
|
mantissa_rounded = round(mantissa, -round_digit)
|
126
125
|
|
@@ -128,8 +127,8 @@ def format_num(num: Decimal, options: FinalizedOptions) -> str:
|
|
128
127
|
Repeat mantissa + exponent discovery after rounding in case rounding
|
129
128
|
altered the required exponent.
|
130
129
|
"""
|
131
|
-
rounded_num = mantissa_rounded * Decimal(
|
132
|
-
mantissa, exp_val
|
130
|
+
rounded_num = mantissa_rounded * Decimal(10) ** Decimal(temp_exp_val)
|
131
|
+
mantissa, exp_val = get_mantissa_exp(rounded_num, exp_mode, exp_val)
|
133
132
|
round_digit = get_round_dec_place(mantissa, round_mode, ndigits)
|
134
133
|
mantissa_rounded = round(mantissa, -int(round_digit))
|
135
134
|
mantissa_rounded = cast(Decimal, mantissa_rounded)
|
@@ -170,7 +169,6 @@ def format_num(num: Decimal, options: FinalizedOptions) -> str:
|
|
170
169
|
capitalize=options.capitalize,
|
171
170
|
superscript=options.superscript,
|
172
171
|
extra_si_prefixes=options.extra_si_prefixes,
|
173
|
-
extra_iec_prefixes=options.extra_iec_prefixes,
|
174
172
|
extra_parts_per_forms=options.extra_parts_per_forms,
|
175
173
|
)
|
176
174
|
|
@@ -179,16 +177,10 @@ def format_num(num: Decimal, options: FinalizedOptions) -> str:
|
|
179
177
|
return result
|
180
178
|
|
181
179
|
|
182
|
-
def format_val_unc(val: Decimal, unc: Decimal, options: FinalizedOptions) -> str:
|
180
|
+
def format_val_unc(val: Decimal, unc: Decimal, options: FinalizedOptions) -> str:
|
183
181
|
"""Format value/uncertainty pair according to input options."""
|
184
182
|
exp_mode = options.exp_mode
|
185
183
|
|
186
|
-
if exp_mode is ExpModeEnum.BINARY or exp_mode is ExpModeEnum.BINARY_IEC:
|
187
|
-
msg = (
|
188
|
-
"Binary exponent modes are not supported for value/uncertainty formatting."
|
189
|
-
)
|
190
|
-
raise NotImplementedError(msg)
|
191
|
-
|
192
184
|
unc = abs(unc)
|
193
185
|
if exp_mode is ExpModeEnum.PERCENT:
|
194
186
|
val *= 100
|
@@ -269,12 +261,12 @@ def format_val_unc(val: Decimal, unc: Decimal, options: FinalizedOptions) -> str
|
|
269
261
|
"""
|
270
262
|
ndigits = -round_digit + exp_val
|
271
263
|
|
272
|
-
val_mantissa, _
|
264
|
+
val_mantissa, _ = get_mantissa_exp(
|
273
265
|
val_rounded,
|
274
266
|
exp_mode=exp_mode,
|
275
267
|
input_exp=exp_val,
|
276
268
|
)
|
277
|
-
unc_mantissa, _
|
269
|
+
unc_mantissa, _ = get_mantissa_exp(
|
278
270
|
unc_rounded,
|
279
271
|
exp_mode=exp_mode,
|
280
272
|
input_exp=exp_val,
|
@@ -337,7 +329,6 @@ def format_val_unc(val: Decimal, unc: Decimal, options: FinalizedOptions) -> str
|
|
337
329
|
exp_mode=exp_mode,
|
338
330
|
exp_format=options.exp_format,
|
339
331
|
extra_si_prefixes=options.extra_si_prefixes,
|
340
|
-
extra_iec_prefixes=options.extra_iec_prefixes,
|
341
332
|
extra_parts_per_forms=options.extra_parts_per_forms,
|
342
333
|
capitalize=options.capitalize,
|
343
334
|
superscript=options.superscript,
|
@@ -6,12 +6,11 @@ import re
|
|
6
6
|
from typing import Literal, get_args
|
7
7
|
|
8
8
|
ascii_exp_pattern = re.compile(
|
9
|
-
r"^(?P<mantissa>.*)(?P<ascii_base>[
|
9
|
+
r"^(?P<mantissa>.*)(?P<ascii_base>[eE])(?P<exp>[+-]\d+)$",
|
10
10
|
)
|
11
|
-
ascii_base_dict = {"e": 10, "E": 10, "b": 2, "B": 2}
|
12
11
|
|
13
12
|
unicode_exp_pattern = re.compile(
|
14
|
-
r"^(?P<mantissa>.*)×
|
13
|
+
r"^(?P<mantissa>.*)×10(?P<super_exp>[⁺⁻]?[⁰¹²³⁴⁵⁶⁷⁸⁹]+)$",
|
15
14
|
)
|
16
15
|
superscript_translation = str.maketrans("⁺⁻⁰¹²³⁴⁵⁶⁷⁸⁹", "+-0123456789")
|
17
16
|
|
@@ -19,24 +18,17 @@ output_formats = Literal["latex", "html", "ascii"]
|
|
19
18
|
|
20
19
|
|
21
20
|
def _make_exp_str(
|
22
|
-
base: int,
|
23
21
|
exp: int,
|
24
22
|
output_format: output_formats,
|
25
23
|
*,
|
26
24
|
capitalize: bool = False,
|
27
25
|
) -> str:
|
28
26
|
if output_format == "latex":
|
29
|
-
return rf"\
|
27
|
+
return rf"\times10^{{{exp}}}"
|
30
28
|
if output_format == "html":
|
31
|
-
return f"×
|
29
|
+
return f"×10<sup>{exp}</sup>"
|
32
30
|
if output_format == "ascii":
|
33
|
-
|
34
|
-
exp_str = f"e{exp:+03d}"
|
35
|
-
elif base == 2:
|
36
|
-
exp_str = f"b{exp:+03d}"
|
37
|
-
else:
|
38
|
-
msg = f"base must be 10 or 2, not {base}"
|
39
|
-
raise ValueError(msg)
|
31
|
+
exp_str = f"e{exp:+03d}"
|
40
32
|
if capitalize:
|
41
33
|
exp_str = exp_str.upper()
|
42
34
|
return exp_str
|
@@ -116,10 +108,8 @@ def convert_sciform_format(
|
|
116
108
|
if match := re.match(ascii_exp_pattern, formatted_str):
|
117
109
|
mantissa = match.group("mantissa")
|
118
110
|
ascii_base = match.group("ascii_base")
|
119
|
-
base = ascii_base_dict[ascii_base]
|
120
111
|
exp = int(match.group("exp"))
|
121
112
|
exp_str = _make_exp_str(
|
122
|
-
base,
|
123
113
|
exp,
|
124
114
|
output_format,
|
125
115
|
capitalize=ascii_base.isupper(),
|
@@ -128,10 +118,9 @@ def convert_sciform_format(
|
|
128
118
|
suffix_str = exp_str
|
129
119
|
elif match := re.match(unicode_exp_pattern, formatted_str):
|
130
120
|
mantissa = match.group("mantissa")
|
131
|
-
base = int(match.group("base"))
|
132
121
|
super_exp = match.group("super_exp")
|
133
122
|
exp = int(super_exp.translate(superscript_translation))
|
134
|
-
exp_str = _make_exp_str(
|
123
|
+
exp_str = _make_exp_str(exp, output_format)
|
135
124
|
main_str = mantissa
|
136
125
|
suffix_str = exp_str
|
137
126
|
else:
|
sciform/formatting/parser.py
CHANGED
@@ -51,9 +51,9 @@ paren_pattern = rf"""
|
|
51
51
|
"""
|
52
52
|
|
53
53
|
# language=pythonverboseregexp
|
54
|
-
ascii_exp_pattern = r"(?P<ascii_exp>(?P<ascii_base>[
|
54
|
+
ascii_exp_pattern = r"(?P<ascii_exp>(?P<ascii_base>[eE])(?P<ascii_exp_val>[+-]\d+))"
|
55
55
|
# language=pythonverboseregexp
|
56
|
-
uni_exp_pattern = r"(?P<uni_exp>×
|
56
|
+
uni_exp_pattern = r"(?P<uni_exp>×10(?P<uni_exp_val>[⁺⁻]?[⁰¹²³⁴⁵⁶⁷⁸⁹]+))"
|
57
57
|
# language=pythonverboseregexp
|
58
58
|
prefix_exp_pattern = r"(\ (?P<prefix_exp>[a-zA-zμ]+))"
|
59
59
|
# language=pythonverboseregexp
|
@@ -88,79 +88,58 @@ $
|
|
88
88
|
superscript_translation = str.maketrans("⁺⁻⁰¹²³⁴⁵⁶⁷⁸⁹", "+-0123456789")
|
89
89
|
|
90
90
|
|
91
|
-
def
|
92
|
-
|
93
|
-
if base.lower() == "e":
|
94
|
-
base = 10
|
95
|
-
elif base.lower() == "b":
|
96
|
-
base = 2
|
97
|
-
else: # pragma: no cover
|
98
|
-
msg = f'Unexpected ASCII base: "{base}"'
|
99
|
-
raise ValueError(msg)
|
100
|
-
exp_val = int(match.group("ascii_exp_val"))
|
101
|
-
return base, exp_val
|
91
|
+
def _get_ascii_exp_val(match: re.Match) -> int:
|
92
|
+
return int(match.group("ascii_exp_val"))
|
102
93
|
|
103
94
|
|
104
|
-
def
|
105
|
-
|
106
|
-
exp_val = int(match.group("uni_exp_val").translate(superscript_translation))
|
107
|
-
return base, exp_val
|
95
|
+
def _get_unicode_exp_val(match: re.Match) -> int:
|
96
|
+
return int(match.group("uni_exp_val").translate(superscript_translation))
|
108
97
|
|
109
98
|
|
110
|
-
def
|
111
|
-
|
99
|
+
def _get_prefix_exp_val(prefix_exp: str) -> int:
|
100
|
+
candidate_exp_vals = []
|
112
101
|
global_options = global_options_module.GLOBAL_DEFAULT_OPTIONS
|
113
102
|
|
114
103
|
si_translations = exp_translations.val_to_si_dict.copy()
|
115
104
|
si_translations.update(global_options.extra_si_prefixes)
|
116
105
|
for key, value in si_translations.items():
|
117
106
|
if prefix_exp == value:
|
118
|
-
|
107
|
+
candidate_exp_vals.append(key)
|
119
108
|
|
120
109
|
pp_translations = exp_translations.val_to_parts_per_dict.copy()
|
121
110
|
pp_translations.update(global_options.extra_parts_per_forms)
|
122
111
|
for key, value in pp_translations.items():
|
123
112
|
if prefix_exp == value:
|
124
|
-
|
125
|
-
|
126
|
-
iec_translations = exp_translations.val_to_iec_dict.copy()
|
127
|
-
iec_translations.update(global_options.extra_iec_prefixes)
|
128
|
-
for key, value in iec_translations.items():
|
129
|
-
if prefix_exp == value:
|
130
|
-
candidate_base_exp_val_pairs.append((2, key))
|
113
|
+
candidate_exp_vals.append(key)
|
131
114
|
|
132
|
-
if len(
|
115
|
+
if len(candidate_exp_vals) == 0:
|
133
116
|
msg = f'Unrecognized prefix: "{prefix_exp}". Unable to parse input.'
|
134
117
|
raise ValueError(msg)
|
135
|
-
if len(set(
|
136
|
-
candidate_exps = [
|
137
|
-
candidate_pair[1] for candidate_pair in candidate_base_exp_val_pairs
|
138
|
-
]
|
118
|
+
if len(set(candidate_exp_vals)) > 1:
|
139
119
|
msg = (
|
140
|
-
f'Multiple translations found for "{prefix_exp}": {
|
120
|
+
f'Multiple translations found for "{prefix_exp}": {candidate_exp_vals}. '
|
141
121
|
f"Unable to parse input."
|
142
122
|
)
|
143
123
|
raise ValueError(msg)
|
144
|
-
|
145
|
-
return
|
124
|
+
exp_val = candidate_exp_vals[0]
|
125
|
+
return exp_val
|
146
126
|
|
147
127
|
|
148
|
-
def
|
128
|
+
def _extract_exp_val(
|
149
129
|
match: re.Match,
|
150
130
|
) -> tuple[int, int]:
|
151
131
|
if match.group("ascii_exp"):
|
152
|
-
|
132
|
+
exp_val = _get_ascii_exp_val(match)
|
153
133
|
elif match.group("uni_exp"):
|
154
|
-
|
134
|
+
exp_val = _get_unicode_exp_val(match)
|
155
135
|
elif prefix_exp := match.group("prefix_exp"):
|
156
|
-
|
136
|
+
exp_val = _get_prefix_exp_val(prefix_exp)
|
157
137
|
elif match.group("percent_exp"):
|
158
|
-
base = 10
|
159
138
|
exp_val = -2
|
160
139
|
else: # pragma: no cover
|
161
140
|
msg = "Expected named match groups not found."
|
162
141
|
raise ValueError(msg)
|
163
|
-
return
|
142
|
+
return exp_val
|
164
143
|
|
165
144
|
|
166
145
|
def _infer_decimal_separator(
|
@@ -252,54 +231,52 @@ def _normalize_separators(
|
|
252
231
|
return input_str
|
253
232
|
|
254
233
|
|
255
|
-
def _parse_no_exp_pattern(match: re.Match) -> tuple[str, str | None, int
|
234
|
+
def _parse_no_exp_pattern(match: re.Match) -> tuple[str, str | None, int]:
|
256
235
|
if val := match.group("non_finite_val"):
|
257
236
|
unc = None
|
258
237
|
else:
|
259
238
|
val = match.group("pm_val")
|
260
239
|
unc = match.group("pm_unc")
|
261
|
-
base = 10
|
262
240
|
exp_val = 0
|
263
|
-
return val, unc,
|
241
|
+
return val, unc, exp_val
|
264
242
|
|
265
243
|
|
266
|
-
def _parse_optional_exp_pattern(match: re.Match) -> tuple[str, str | None, int
|
244
|
+
def _parse_optional_exp_pattern(match: re.Match) -> tuple[str, str | None, int]:
|
267
245
|
if match.group("exp"):
|
268
|
-
|
246
|
+
exp_val = _extract_exp_val(match)
|
269
247
|
else:
|
270
|
-
base = 10
|
271
248
|
exp_val = 0
|
272
249
|
if val := match.group("val"):
|
273
250
|
unc = None
|
274
251
|
else:
|
275
252
|
val = match.group("paren_val")
|
276
253
|
unc = match.group("paren_unc")
|
277
|
-
return val, unc,
|
254
|
+
return val, unc, exp_val
|
278
255
|
|
279
256
|
|
280
|
-
def _parse_always_exp_pattern(match: re.Match) -> tuple[str, str | None, int
|
281
|
-
|
257
|
+
def _parse_always_exp_pattern(match: re.Match) -> tuple[str, str | None, int]:
|
258
|
+
exp_val = _extract_exp_val(match)
|
282
259
|
if val := match.group("non_finite_val"):
|
283
260
|
unc = None
|
284
261
|
else:
|
285
262
|
val = match.group("pm_val")
|
286
263
|
unc = match.group("pm_unc")
|
287
|
-
return val, unc,
|
264
|
+
return val, unc, exp_val
|
288
265
|
|
289
266
|
|
290
|
-
def
|
267
|
+
def _extract_val_unc_exp(
|
291
268
|
input_str: str,
|
292
|
-
) -> tuple[str, str | None, int
|
269
|
+
) -> tuple[str, str | None, int]:
|
293
270
|
if match := re.fullmatch(no_exp_pattern, input_str, re.VERBOSE):
|
294
|
-
val, unc,
|
271
|
+
val, unc, exp_val = _parse_no_exp_pattern(match)
|
295
272
|
elif match := re.fullmatch(optional_exp_pattern, input_str, re.VERBOSE):
|
296
|
-
val, unc,
|
273
|
+
val, unc, exp_val = _parse_optional_exp_pattern(match)
|
297
274
|
elif match := re.fullmatch(always_exp_pattern, input_str, re.VERBOSE):
|
298
|
-
val, unc,
|
275
|
+
val, unc, exp_val = _parse_always_exp_pattern(match)
|
299
276
|
else:
|
300
277
|
msg = f'Input string "{input_str}" does not match any expected input format.'
|
301
278
|
raise ValueError(msg)
|
302
|
-
return val, unc,
|
279
|
+
return val, unc, exp_val
|
303
280
|
|
304
281
|
|
305
282
|
def parse_val_unc_from_str(
|
@@ -319,8 +296,8 @@ def parse_val_unc_from_str(
|
|
319
296
|
(INF)e+00, or "(123.000 ± 0.456)e+01"
|
320
297
|
|
321
298
|
Whichever pattern is matched is then parsed to extract the value,
|
322
|
-
uncertainty, and exponent
|
323
|
-
is available then
|
299
|
+
uncertainty, and exponent value (if no exponent information
|
300
|
+
is available then the exponent value is set to 0).
|
324
301
|
|
325
302
|
Next, grouping separators such as "_" or " " are stripped from the
|
326
303
|
value and uncertainty strings. An algorithm is then run to detect
|
@@ -339,7 +316,7 @@ def parse_val_unc_from_str(
|
|
339
316
|
Finally, the value and uncertainty strings are converted to decimals
|
340
317
|
and multiplied by the extracted exponents.
|
341
318
|
"""
|
342
|
-
val, unc,
|
319
|
+
val, unc, exp_val = _extract_val_unc_exp(input_str)
|
343
320
|
|
344
321
|
decimal_separator = _parse_decimal_separator(val, unc, decimal_separator)
|
345
322
|
|
@@ -372,16 +349,15 @@ def parse_val_unc_from_str(
|
|
372
349
|
raise ValueError(msg)
|
373
350
|
unc = "0." + "0" * num_missing_zeros + unc
|
374
351
|
|
375
|
-
base = Decimal(base)
|
376
352
|
exp_val = Decimal(exp_val)
|
377
353
|
val = Decimal(val)
|
378
354
|
if val.is_finite():
|
379
|
-
val *=
|
355
|
+
val *= 10**exp_val
|
380
356
|
|
381
357
|
if unc is not None:
|
382
358
|
unc = Decimal(unc)
|
383
359
|
if unc.is_finite():
|
384
|
-
unc *=
|
360
|
+
unc *= 10**exp_val
|
385
361
|
|
386
362
|
return val, unc
|
387
363
|
|
sciform/options/input_options.py
CHANGED
@@ -62,7 +62,6 @@ class InputOptions:
|
|
62
62
|
left_pad_dec_place: int | None = None
|
63
63
|
exp_format: option_types.ExpFormat | None = None
|
64
64
|
extra_si_prefixes: dict[int, str] | None = None
|
65
|
-
extra_iec_prefixes: dict[int, str] | None = None
|
66
65
|
extra_parts_per_forms: dict[int, str] | None = None
|
67
66
|
capitalize: bool | None = None
|
68
67
|
superscript: bool | None = None
|
sciform/options/option_types.py
CHANGED
@@ -74,8 +74,6 @@ ExpMode = Literal[
|
|
74
74
|
"scientific",
|
75
75
|
"engineering",
|
76
76
|
"engineering_shifted",
|
77
|
-
"binary",
|
78
|
-
"binary_iec",
|
79
77
|
]
|
80
78
|
|
81
79
|
|
@@ -87,8 +85,6 @@ class ExpModeEnum(str, Enum):
|
|
87
85
|
SCIENTIFIC = "scientific"
|
88
86
|
ENGINEERING = "engineering"
|
89
87
|
ENGINEERING_SHIFTED = "engineering_shifted"
|
90
|
-
BINARY = "binary"
|
91
|
-
BINARY_IEC = "binary_iec"
|
92
88
|
|
93
89
|
|
94
90
|
ExpFormat = Literal["standard", "prefix", "parts_per"]
|
@@ -55,7 +55,6 @@ class PopulatedOptions:
|
|
55
55
|
'left_pad_dec_place': 0,
|
56
56
|
'exp_format': 'standard',
|
57
57
|
'extra_si_prefixes': {},
|
58
|
-
'extra_iec_prefixes': {},
|
59
58
|
'extra_parts_per_forms': {},
|
60
59
|
'capitalize': False,
|
61
60
|
'superscript': True,
|
@@ -66,7 +65,7 @@ class PopulatedOptions:
|
|
66
65
|
'pm_whitespace': True,
|
67
66
|
)
|
68
67
|
>>> print(formatter.populated_options.as_dict())
|
69
|
-
{'exp_mode': 'engineering', 'exp_val': 'auto', 'round_mode': 'sig_fig', 'ndigits': 2, 'upper_separator': '', 'decimal_separator': '.', 'lower_separator': '', 'sign_mode': '-', 'left_pad_char': ' ', 'left_pad_dec_place': 0, 'exp_format': 'standard', 'extra_si_prefixes': {}, '
|
68
|
+
{'exp_mode': 'engineering', 'exp_val': 'auto', 'round_mode': 'sig_fig', 'ndigits': 2, 'upper_separator': '', 'decimal_separator': '.', 'lower_separator': '', 'sign_mode': '-', 'left_pad_char': ' ', 'left_pad_dec_place': 0, 'exp_format': 'standard', 'extra_si_prefixes': {}, 'extra_parts_per_forms': {}, 'capitalize': False, 'superscript': True, 'nan_inf_exp': False, 'paren_uncertainty': False, 'left_pad_matching': False, 'paren_uncertainty_trim': True, 'pm_whitespace': True}
|
70
69
|
|
71
70
|
Note that :class:`PopulatedOptions` lacks the ``add_c_prefix``,
|
72
71
|
``add_small_si_prefixes`` and ``add_ppth_form`` options present
|
@@ -103,7 +102,6 @@ class PopulatedOptions:
|
|
103
102
|
left_pad_dec_place: int
|
104
103
|
exp_format: option_types.ExpFormat
|
105
104
|
extra_si_prefixes: dict[int, str]
|
106
|
-
extra_iec_prefixes: dict[int, str]
|
107
105
|
extra_parts_per_forms: dict[int, str]
|
108
106
|
capitalize: bool
|
109
107
|
superscript: bool
|
sciform/options/validation.py
CHANGED
@@ -89,12 +89,6 @@ def validate_exp_val(
|
|
89
89
|
f"for engineering exponent modes."
|
90
90
|
)
|
91
91
|
raise ValueError(msg)
|
92
|
-
if options.exp_mode == "binary_iec" and options.exp_val % 10 != 0:
|
93
|
-
msg = (
|
94
|
-
f"Exponent must be a multiple of 10, not "
|
95
|
-
f"exp_val={options.exp_val}, for binary IEC exponent mode."
|
96
|
-
)
|
97
|
-
raise ValueError(msg)
|
98
92
|
|
99
93
|
|
100
94
|
def validate_exp_options(
|
@@ -188,7 +182,6 @@ def validate_extra_translations(
|
|
188
182
|
"""Validate translation dictionary have int keys and alphabetic values."""
|
189
183
|
translations_dicts = [
|
190
184
|
options.extra_si_prefixes,
|
191
|
-
options.extra_iec_prefixes,
|
192
185
|
options.extra_parts_per_forms,
|
193
186
|
]
|
194
187
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: sciform
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.39.0
|
4
4
|
Summary: A package for formatting numbers into scientific formatted strings.
|
5
5
|
Author-email: Justin Gerber <justin.gerber48@gmail.com>
|
6
6
|
Project-URL: homepage, https://github.com/jagerber48/sciform
|
@@ -90,10 +90,9 @@ Overview
|
|
90
90
|
|
91
91
|
``sciform`` is used to convert python numbers into strings according to
|
92
92
|
a variety of user-selected scientific formatting options including
|
93
|
-
|
93
|
+
fixed-point, scientific and engineering formats.
|
94
94
|
Where possible, formatting follows documented standards such as those
|
95
|
-
published by `BIPM <https://www.bipm.org/en/>`_
|
96
|
-
`IEC <https://iec.ch/homepage>`_.
|
95
|
+
published by `BIPM <https://www.bipm.org/en/>`_.
|
97
96
|
``sciform`` provides certain options, such as engineering notation,
|
98
97
|
well-controlled significant figure rounding, and separator customization
|
99
98
|
which are not provided by the python built-in
|
@@ -0,0 +1,31 @@
|
|
1
|
+
sciform/__init__.py,sha256=Lnb1fep9vjJ7n4U5YdNqRkq9saXuRvppedpW1TZm99Y,781
|
2
|
+
sciform/api/__init__.py,sha256=kWXKOuVgwn3580EBGGs4t2uK7_uBgjfvQq2r8b9ZPrM,24
|
3
|
+
sciform/api/formatted_number.py,sha256=VdQGRXmUy_Pwc2SeYT8KlZMJBJDu0maI0HHv9DXu1fQ,2804
|
4
|
+
sciform/api/formatter.py,sha256=-Cgfbk8M9DGoP0Da8PAzjJVnNqya8NBd-A9osHL0Ov8,14962
|
5
|
+
sciform/api/global_configuration.py,sha256=f6N5GqbvBvNL1mHm4uTnyoom28dwoxtfEys1f1YpPmc,6656
|
6
|
+
sciform/api/scinum.py,sha256=XF4QiBAlehEKnk_NwDDVWmLnRDwfEalmuzC8b2qUE4Q,3363
|
7
|
+
sciform/format_utils/__init__.py,sha256=9tCbjsOOiqvw0DoMUo9qcIC8pFykfVZZ8wkEIRAh-OE,132
|
8
|
+
sciform/format_utils/exp_translations.py,sha256=e7yJkWsbTJfF_k8kfvctZ2llZRrn908biyZ1ulu1M4w,429
|
9
|
+
sciform/format_utils/exponents.py,sha256=Wq6m6N9qZcyf1hAeWhKraHOJTtd8NiYiB9niNI4DiXI,3254
|
10
|
+
sciform/format_utils/grouping.py,sha256=1hZjjVKRUy477LGGFniZwwEHHBDaSb6E0K3SAeCACVY,1641
|
11
|
+
sciform/format_utils/make_strings.py,sha256=4g1E3UBDLeoF272OpIGCiuzeZ4KsDjWNiXvbMIfr3sg,5258
|
12
|
+
sciform/format_utils/numbers.py,sha256=Se3F9qTooRrtBw_b9n-Nx4Nd1tkV-44glO1KZ9kCjVg,4603
|
13
|
+
sciform/format_utils/rounding.py,sha256=VkvIg_UNpGfBG8QQQVGLZPwNfw5Tj3jlM8Wgx1r6ils,3491
|
14
|
+
sciform/formatting/__init__.py,sha256=T_DnF4vkeAQx1xuzff7rRZbWj-hEbNI6Pj2D2831L9E,38
|
15
|
+
sciform/formatting/fsml.py,sha256=-dLnJ0ZfmQw4XdeAi1EF9brgiGsFLOIJmBWCzr9bTEc,3679
|
16
|
+
sciform/formatting/number_formatting.py,sha256=rOwBCsr2_ccmGiU9JpPs2aNwlw82GJf-iOlZqOfQoxg,11802
|
17
|
+
sciform/formatting/output_conversion.py,sha256=kwYJsj33RE1BVPMfK28wYni6KhcMhfHNap78cQfE-qo,5136
|
18
|
+
sciform/formatting/parser.py,sha256=j9rdxXrV_6gMD0_AdvdS4PJ5aGMAxyJ9yRSr2_WvDLM,15190
|
19
|
+
sciform/options/__init__.py,sha256=tw_CZHaNrdixZoQyG6ZD5UMKkQxXok0qBQCxt28Gh20,51
|
20
|
+
sciform/options/conversion.py,sha256=2ad0Mwwb7qqJ5xClevxaUVkVznokQBmAVVewh_5-7jU,4146
|
21
|
+
sciform/options/finalized_options.py,sha256=6LNX38NBsiZkZD4zZtmIMJ7LteP8-bmQGBweDNfWPyI,1223
|
22
|
+
sciform/options/global_options.py,sha256=3uJT47dg2cmiCc-DSeQi-9ES39RagZcN1lrp6eXg_6A,670
|
23
|
+
sciform/options/input_options.py,sha256=0PIc4JINvY2XRPpv9s4zhclPsII3MTT77j4Kf1tWb1k,3753
|
24
|
+
sciform/options/option_types.py,sha256=nEzkj3QHRSGEYr6R2hCOKtRcHIwhHS9BD8QRAX931vM,2262
|
25
|
+
sciform/options/populated_options.py,sha256=0n0vWH8ixNxwWGxAJdGzi46--noDfiOrOJpx4Hu6iaw,4865
|
26
|
+
sciform/options/validation.py,sha256=8Zg5dcp-sPqyZWo5zMZVMzAmFS5KlA8kTjdMGBG9VmU,7754
|
27
|
+
sciform-0.39.0.dist-info/LICENSE,sha256=-oyCEZu-6HLrRSfRg44uuNDE0c59GVEdqYIgidqSP70,1056
|
28
|
+
sciform-0.39.0.dist-info/METADATA,sha256=S6iVxqbYucDB_mI4XKUSBiykbRbzZMGltkKkP4tnLUM,8937
|
29
|
+
sciform-0.39.0.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
|
30
|
+
sciform-0.39.0.dist-info/top_level.txt,sha256=mC01YOQ-1u5pDk9BJia-pQKLUMvkreMsldDpFcp7NV8,8
|
31
|
+
sciform-0.39.0.dist-info/RECORD,,
|
sciform-0.38.2.dist-info/RECORD
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
sciform/__init__.py,sha256=Lnb1fep9vjJ7n4U5YdNqRkq9saXuRvppedpW1TZm99Y,781
|
2
|
-
sciform/api/__init__.py,sha256=kWXKOuVgwn3580EBGGs4t2uK7_uBgjfvQq2r8b9ZPrM,24
|
3
|
-
sciform/api/formatted_number.py,sha256=VdQGRXmUy_Pwc2SeYT8KlZMJBJDu0maI0HHv9DXu1fQ,2804
|
4
|
-
sciform/api/formatter.py,sha256=0eOLQmrNnhDO05rbMMOhPjYUYYkW5fT-SiUAxGKXWEI,15554
|
5
|
-
sciform/api/global_configuration.py,sha256=iSmGcnfs-2cvWz27t9ka9ibDuN732sLwDsLJTi8SA-g,6866
|
6
|
-
sciform/api/scinum.py,sha256=XF4QiBAlehEKnk_NwDDVWmLnRDwfEalmuzC8b2qUE4Q,3363
|
7
|
-
sciform/format_utils/__init__.py,sha256=9tCbjsOOiqvw0DoMUo9qcIC8pFykfVZZ8wkEIRAh-OE,132
|
8
|
-
sciform/format_utils/exp_translations.py,sha256=uh9ZxDKcGcMVSNwj7qkr5TSA6MINIaU1RHZeqKVwEQ0,575
|
9
|
-
sciform/format_utils/exponents.py,sha256=khG9mkHRG-qb2Xnd_lpkLXwV8KcHUJekgC8MwgfSL_U,3976
|
10
|
-
sciform/format_utils/grouping.py,sha256=1hZjjVKRUy477LGGFniZwwEHHBDaSb6E0K3SAeCACVY,1641
|
11
|
-
sciform/format_utils/make_strings.py,sha256=4g1E3UBDLeoF272OpIGCiuzeZ4KsDjWNiXvbMIfr3sg,5258
|
12
|
-
sciform/format_utils/numbers.py,sha256=L3J8B7GR6RWNaYthDmnY5d4bLYBviCYw-Evqb754VTw,5799
|
13
|
-
sciform/format_utils/rounding.py,sha256=VkvIg_UNpGfBG8QQQVGLZPwNfw5Tj3jlM8Wgx1r6ils,3491
|
14
|
-
sciform/formatting/__init__.py,sha256=T_DnF4vkeAQx1xuzff7rRZbWj-hEbNI6Pj2D2831L9E,38
|
15
|
-
sciform/formatting/fsml.py,sha256=J2Zd7RD4E32hNTP2Vo_2PEvzHBt3aIUerhLT72stovQ,3843
|
16
|
-
sciform/formatting/number_formatting.py,sha256=_4SxAzo3VLp6_ThrJfn9yQu3rH_0_27NOftNSPfIMA8,12268
|
17
|
-
sciform/formatting/output_conversion.py,sha256=TdcfQa0p7S7iIkqcwVYbxCGwoGu4mPOV3XzjABnaGmA,5523
|
18
|
-
sciform/formatting/parser.py,sha256=58noOOyg5m3NKJwGfEEwiUivzm5vGPG3K1_OXIrrVAk,16310
|
19
|
-
sciform/options/__init__.py,sha256=tw_CZHaNrdixZoQyG6ZD5UMKkQxXok0qBQCxt28Gh20,51
|
20
|
-
sciform/options/conversion.py,sha256=2ad0Mwwb7qqJ5xClevxaUVkVznokQBmAVVewh_5-7jU,4146
|
21
|
-
sciform/options/finalized_options.py,sha256=r38T1qp2sLD0mVIOovfax2Q46zb7yjjypr1CpUsqMCA,1262
|
22
|
-
sciform/options/global_options.py,sha256=T_OXFKi2qO5PV-LTZt9ClppWYsUmStBgyQqFuoX6idM,697
|
23
|
-
sciform/options/input_options.py,sha256=ibUMS9q_hdf9lms90hA6FzbEZpe-KVdZg5K-A1H7j3Q,3806
|
24
|
-
sciform/options/option_types.py,sha256=nZa_HZHlRf6ILbKxXbP1lqB3s9WoJRYv0uLQonY5ud8,2346
|
25
|
-
sciform/options/populated_options.py,sha256=7TBuSxBvcUopF16NIMQuGoAT6B0vq0HLigO7qrIld1A,4961
|
26
|
-
sciform/options/validation.py,sha256=b70AE6AqbNjEsBkVXwYDQRCQnwVbqWWJ7eUxh2jkyqU,8092
|
27
|
-
sciform-0.38.2.dist-info/LICENSE,sha256=-oyCEZu-6HLrRSfRg44uuNDE0c59GVEdqYIgidqSP70,1056
|
28
|
-
sciform-0.38.2.dist-info/METADATA,sha256=unQrN6dtmkyuGB6Yl2WsKHZyZgO5isUV7ywTEgvWCyY,8990
|
29
|
-
sciform-0.38.2.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
30
|
-
sciform-0.38.2.dist-info/top_level.txt,sha256=mC01YOQ-1u5pDk9BJia-pQKLUMvkreMsldDpFcp7NV8,8
|
31
|
-
sciform-0.38.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|