si_unit_prefix/
lib.rs

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}