-
Notifications
You must be signed in to change notification settings - Fork 0
/
metric-unit.go
57 lines (50 loc) · 1.71 KB
/
metric-unit.go
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
package measurement
import "github.com/boundedinfinity/go-commoner/idiomatic/mather/rational"
var (
metricUnitsCf map[MetricUnit]float64
metricUnitsAbbr map[MetricUnit][]string
)
func init() {
metricUnitsCf = map[MetricUnit]float64{
MetricUnits.Tera: 10e12,
MetricUnits.Giga: 10e9,
MetricUnits.Mega: 10e6,
MetricUnits.Kilo: 10e3,
MetricUnits.Hecto: 10e2,
MetricUnits.Deca: 10e1,
MetricUnits.Unit: 1.0,
MetricUnits.Deci: 10e-1,
MetricUnits.Centi: 10e-2,
MetricUnits.Milli: 10e-3,
MetricUnits.Micro: 10e-6,
MetricUnits.Nano: 10e-9,
MetricUnits.Pico: 10e-12,
}
metricUnitsAbbr = map[MetricUnit][]string{
MetricUnits.Tera: {MetricUnits.Tera.String(), "T"},
MetricUnits.Giga: {MetricUnits.Giga.String(), "G"},
MetricUnits.Mega: {MetricUnits.Mega.String(), "M"},
MetricUnits.Kilo: {MetricUnits.Kilo.String(), "k"},
MetricUnits.Hecto: {MetricUnits.Hecto.String(), "h"},
MetricUnits.Deca: {MetricUnits.Deca.String(), "da"},
MetricUnits.Unit: {},
MetricUnits.Deci: {MetricUnits.Deci.String(), "d"},
MetricUnits.Centi: {MetricUnits.Centi.String(), "c"},
MetricUnits.Milli: {MetricUnits.Milli.String(), "m"},
MetricUnits.Micro: {MetricUnits.Micro.String(), "u", "μ"},
MetricUnits.Nano: {MetricUnits.Nano.String(), "n"},
MetricUnits.Pico: {MetricUnits.Pico.String(), "p"},
}
}
func (t metricUnits) Convert(number rational.Rational, from, to MetricUnit) rational.Rational {
return rational.FromFloat(t.convert(number.Float(), from, to))
}
func (t metricUnits) convert(number float64, from, to MetricUnit) float64 {
var float float64
fromCf, fromOk := metricUnitsCf[from]
toCf, toOk := metricUnitsCf[to]
if fromOk && toOk {
float = number * fromCf * toCf
}
return float
}