Skip to content

Commit f760ecc

Browse files
lance-pylescclauss
andauthored
initial commit of prefix-conversions (#2243)
* initial commit of prefix-conversions * minor tweaks; * Lose the blank lines Co-authored-by: Christian Clauss <[email protected]>
1 parent 9ea144f commit f760ecc

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

Diff for: conversions/prefix_conversions.py

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
"""
2+
Convert International System of Units (SI) and Binary prefixes
3+
"""
4+
from enum import Enum
5+
from typing import Union
6+
7+
8+
class SI_Unit(Enum):
9+
yotta = 24
10+
zetta = 21
11+
exa = 18
12+
peta = 15
13+
tera = 12
14+
giga = 9
15+
mega = 6
16+
kilo = 3
17+
hecto = 2
18+
deca = 1
19+
deci = -1
20+
centi = -2
21+
milli = -3
22+
micro = -6
23+
nano = -9
24+
pico = -12
25+
femto = -15
26+
atto = -18
27+
zepto = -21
28+
yocto = -24
29+
30+
31+
class Binary_Unit(Enum):
32+
yotta = 8
33+
zetta = 7
34+
exa = 6
35+
peta = 5
36+
tera = 4
37+
giga = 3
38+
mega = 2
39+
kilo = 1
40+
41+
42+
def convert_si_prefix(
43+
known_amount: float,
44+
known_prefix: Union[str, SI_Unit],
45+
unknown_prefix: Union[str, SI_Unit],
46+
) -> float:
47+
"""
48+
Wikipedia reference: https://en.wikipedia.org/wiki/Binary_prefix
49+
Wikipedia reference: https://en.wikipedia.org/wiki/International_System_of_Units
50+
>>> convert_si_prefix(1, SI_Unit.giga, SI_Unit.mega)
51+
1000
52+
>>> convert_si_prefix(1, SI_Unit.mega, SI_Unit.giga)
53+
0.001
54+
>>> convert_si_prefix(1, SI_Unit.kilo, SI_Unit.kilo)
55+
1
56+
>>> convert_si_prefix(1, 'giga', 'mega')
57+
1000
58+
>>> convert_si_prefix(1, 'gIGa', 'mEGa')
59+
1000
60+
"""
61+
if isinstance(known_prefix, str):
62+
known_prefix: SI_Unit = SI_Unit[known_prefix.lower()]
63+
if isinstance(unknown_prefix, str):
64+
unknown_prefix: SI_Unit = SI_Unit[unknown_prefix.lower()]
65+
unknown_amount = known_amount * (10 ** (known_prefix.value - unknown_prefix.value))
66+
return unknown_amount
67+
68+
69+
def convert_binary_prefix(
70+
known_amount: float,
71+
known_prefix: Union[str, Binary_Unit],
72+
unknown_prefix: Union[str, Binary_Unit],
73+
) -> float:
74+
"""
75+
Wikipedia reference: https://en.wikipedia.org/wiki/Metric_prefix
76+
>>> convert_binary_prefix(1, Binary_Unit.giga, Binary_Unit.mega)
77+
1024
78+
>>> convert_binary_prefix(1, Binary_Unit.mega, Binary_Unit.giga)
79+
0.0009765625
80+
>>> convert_binary_prefix(1, Binary_Unit.kilo, Binary_Unit.kilo)
81+
1
82+
>>> convert_binary_prefix(1, 'giga', 'mega')
83+
1024
84+
>>> convert_binary_prefix(1, 'gIGa', 'mEGa')
85+
1024
86+
"""
87+
if isinstance(known_prefix, str):
88+
known_prefix: Binary_Unit = Binary_Unit[known_prefix.lower()]
89+
if isinstance(unknown_prefix, str):
90+
unknown_prefix: Binary_Unit = Binary_Unit[unknown_prefix.lower()]
91+
unknown_amount = known_amount * (
92+
2 ** ((known_prefix.value - unknown_prefix.value) * 10)
93+
)
94+
return unknown_amount
95+
96+
97+
if __name__ == "__main__":
98+
import doctest
99+
100+
doctest.testmod()

0 commit comments

Comments
 (0)