1#[derive(Debug, serde::Deserialize, serde::Serialize, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
2#[allow(non_camel_case_types)]
3pub enum SiUnitPrefix
4{
5 Q = 30isize,
6 R = 27isize,
7 Y = 24isize,
8 Z = 21isize,
9 E = 18isize,
10 P = 15isize,
11 T = 12isize,
12 G = 9isize,
13 M = 6isize,
14 k = 3isize,
15 h = 2isize,
16 da = 1isize,
17 d = -1isize,
18 c = -2isize,
19 m = -3isize,
20 u = -6isize,
21 n = -9isize,
22 p = -12isize,
23 f = -15isize,
24 a = -18isize,
25 z = -21isize,
26 y = -24isize,
27 r = -27isize,
28 q = -30isize
29}
30
31impl SiUnitPrefix
32{
33 pub fn as_f64(&self) -> f64
34 {
35 match self
36 {
37 SiUnitPrefix::Q => 1e+30f64,
38 SiUnitPrefix::R => 1e+27f64,
39 SiUnitPrefix::Y => 1e+24f64,
40 SiUnitPrefix::Z => 1e+21f64,
41 SiUnitPrefix::E => 1e+18f64,
42 SiUnitPrefix::P => 1e+15f64,
43 SiUnitPrefix::T => 1e+12f64,
44 SiUnitPrefix::G => 1e+9f64,
45 SiUnitPrefix::M => 1e+6f64,
46 SiUnitPrefix::k => 1e+3f64,
47 SiUnitPrefix::h => 1e+2f64,
48 SiUnitPrefix::da => 1e+1f64,
49 SiUnitPrefix::d => 1e-1f64,
50 SiUnitPrefix::c => 1e-2f64,
51 SiUnitPrefix::m => 1e-3f64,
52 SiUnitPrefix::u => 1e-6f64,
53 SiUnitPrefix::n => 1e-9f64,
54 SiUnitPrefix::p => 1e-12f64,
55 SiUnitPrefix::f => 1e-15f64,
56 SiUnitPrefix::a => 1e-18f64,
57 SiUnitPrefix::z => 1e-21f64,
58 SiUnitPrefix::y => 1e-24f64,
59 SiUnitPrefix::r => 1e-27f64,
60 SiUnitPrefix::q => 1e-30f64
61 }
62 }
63
64 pub fn as_f32(&self) -> f32
65 {
66 match self
67 {
68 SiUnitPrefix::Q => 1e+30f32,
69 SiUnitPrefix::R => 1e+27f32,
70 SiUnitPrefix::Y => 1e+24f32,
71 SiUnitPrefix::Z => 1e+21f32,
72 SiUnitPrefix::E => 1e+18f32,
73 SiUnitPrefix::P => 1e+15f32,
74 SiUnitPrefix::T => 1e+12f32,
75 SiUnitPrefix::G => 1e+9f32,
76 SiUnitPrefix::M => 1e+6f32,
77 SiUnitPrefix::k => 1e+3f32,
78 SiUnitPrefix::h => 1e+2f32,
79 SiUnitPrefix::da => 1e+1f32,
80 SiUnitPrefix::d => 1e-1f32,
81 SiUnitPrefix::c => 1e-2f32,
82 SiUnitPrefix::m => 1e-3f32,
83 SiUnitPrefix::u => 1e-6f32,
84 SiUnitPrefix::n => 1e-9f32,
85 SiUnitPrefix::p => 1e-12f32,
86 SiUnitPrefix::f => 1e-15f32,
87 SiUnitPrefix::a => 1e-18f32,
88 SiUnitPrefix::z => 1e-21f32,
89 SiUnitPrefix::y => 1e-24f32,
90 SiUnitPrefix::r => 1e-27f32,
91 SiUnitPrefix::q => 1e-30f32
92 }
93 }
94
95 pub fn as_exp(&self) -> i8
96 {
97 match self
98 {
99 SiUnitPrefix::Q => 30,
100 SiUnitPrefix::R => 27,
101 SiUnitPrefix::Y => 24,
102 SiUnitPrefix::Z => 21,
103 SiUnitPrefix::E => 18,
104 SiUnitPrefix::P => 15,
105 SiUnitPrefix::T => 12,
106 SiUnitPrefix::G => 9,
107 SiUnitPrefix::M => 6,
108 SiUnitPrefix::k => 3,
109 SiUnitPrefix::h => 2,
110 SiUnitPrefix::da => 1,
111 SiUnitPrefix::d => -1,
112 SiUnitPrefix::c => -2,
113 SiUnitPrefix::m => -3,
114 SiUnitPrefix::u => -6,
115 SiUnitPrefix::n => -9,
116 SiUnitPrefix::p => -12,
117 SiUnitPrefix::f => -15,
118 SiUnitPrefix::a => -18,
119 SiUnitPrefix::z => -21,
120 SiUnitPrefix::y => -24,
121 SiUnitPrefix::r => -27,
122 SiUnitPrefix::q => -30
123 }
124 }
125
126 pub fn parse_from_str(unit_str: &str) -> Option<SiUnitPrefix>
127 {
128 match unit_str
129 {
130 v if v.starts_with("Q") => Some(SiUnitPrefix::Q),
131 v if v.starts_with("R") => Some(SiUnitPrefix::R),
132 v if v.starts_with("Y") => Some(SiUnitPrefix::Y),
133 v if v.starts_with("Z") => Some(SiUnitPrefix::Z),
134 v if v.starts_with("E") => Some(SiUnitPrefix::E),
135 v if v.starts_with("P") => Some(SiUnitPrefix::P),
136 v if v.starts_with("T") => Some(SiUnitPrefix::T),
137 v if v.starts_with("G") || v.starts_with("㌐") => Some(SiUnitPrefix::G),
138 v if v.starts_with("M") || v.starts_with("㍋") => Some(SiUnitPrefix::M),
139 v if v.starts_with("k") || v.starts_with("㌔") => Some(SiUnitPrefix::k),
140 v if v.starts_with("h") => Some(SiUnitPrefix::h),
141 v if v.starts_with("da") => Some(SiUnitPrefix::da),
142 v if v.starts_with("d") || v.starts_with("㌥") => Some(SiUnitPrefix::d),
143 v if v.starts_with("c") || v.starts_with("㌢") => Some(SiUnitPrefix::c),
144 v if v.starts_with("m") || v.starts_with("㍉") => Some(SiUnitPrefix::m),
145 v if v.starts_with("u") || v.starts_with("㍃") || v.starts_with("μ") => Some(SiUnitPrefix::u),
146 v if v.starts_with("n") || v.starts_with("㌨") => Some(SiUnitPrefix::n),
147 v if v.starts_with("p") || v.starts_with("㌰") => Some(SiUnitPrefix::p),
148 v if v.starts_with("f") => Some(SiUnitPrefix::f),
149 v if v.starts_with("a") => Some(SiUnitPrefix::a),
150 v if v.starts_with("z") => Some(SiUnitPrefix::z),
151 v if v.starts_with("y") => Some(SiUnitPrefix::y),
152 v if v.starts_with("r") => Some(SiUnitPrefix::r),
153 v if v.starts_with("q") => Some(SiUnitPrefix::q),
154 _ => None
155 }
156 }
157}