package main import ( "math" "github.com/shopspring/decimal" ) var unitRegistry = make(map[string]UnitInfo) func d(f float64) decimal.Decimal { return decimal.NewFromFloat(f) } // initUnits populates the unitRegistry with supported units. func initUnits() { // Length (Pivot: meter) unitRegistry["M"] = UnitInfo{d(1.0), DimLength, "m"} unitRegistry["DM"] = UnitInfo{d(0.1), DimLength, "dm"} unitRegistry["CM"] = UnitInfo{d(0.01), DimLength, "cm"} unitRegistry["MM"] = UnitInfo{d(0.001), DimLength, "mm"} unitRegistry["UM"] = UnitInfo{d(1e-6), DimLength, "um"} unitRegistry["NM"] = UnitInfo{d(1e-9), DimLength, "nm"} unitRegistry["KM"] = UnitInfo{d(1000.0), DimLength, "km"} unitRegistry["IN"] = UnitInfo{d(0.0254), DimLength, "in"} unitRegistry["FT"] = UnitInfo{d(0.3048), DimLength, "ft"} unitRegistry["YD"] = UnitInfo{d(0.9144), DimLength, "yd"} unitRegistry["MI"] = UnitInfo{d(1609.344), DimLength, "mi"} unitRegistry["NMI"] = UnitInfo{d(1852.0), DimLength, "nmi"} // Mass (Pivot: gram) unitRegistry["G"] = UnitInfo{d(1.0), DimMass, "g"} unitRegistry["MG"] = UnitInfo{d(0.001), DimMass, "mg"} unitRegistry["KG"] = UnitInfo{d(1000.0), DimMass, "kg"} unitRegistry["T"] = UnitInfo{d(1e6), DimMass, "t"} unitRegistry["CT"] = UnitInfo{d(0.2), DimMass, "ct"} unitRegistry["LB"] = UnitInfo{d(453.592), DimMass, "lb"} unitRegistry["OZ"] = UnitInfo{d(28.3495), DimMass, "oz"} // Time (Pivot: second) unitRegistry["S"] = UnitInfo{d(1.0), DimTime, "s"} unitRegistry["MS"] = UnitInfo{d(0.001), DimTime, "ms"} unitRegistry["US"] = UnitInfo{d(1e-6), DimTime, "us"} unitRegistry["NS"] = UnitInfo{d(1e-9), DimTime, "ns"} unitRegistry["MIN"] = UnitInfo{d(60.0), DimTime, "min"} unitRegistry["H"] = UnitInfo{d(3600.0), DimTime, "h"} unitRegistry["D"] = UnitInfo{d(86400.0), DimTime, "d"} unitRegistry["WK"] = UnitInfo{d(604800.0), DimTime, "wk"} unitRegistry["YR"] = UnitInfo{d(31536000.0), DimTime, "yr"} // Digital (Pivot: byte) unitRegistry["B"] = UnitInfo{d(1.0), DimDigital, "B"} unitRegistry["KB"] = UnitInfo{d(1024.0), DimDigital, "KB"} unitRegistry["MB"] = UnitInfo{d(1024.0 * 1024.0), DimDigital, "MB"} unitRegistry["GB"] = UnitInfo{d(1024.0 * 1024.0 * 1024.0), DimDigital, "GB"} unitRegistry["TB"] = UnitInfo{d(1024.0 * 1024.0 * 1024.0 * 1024.0), DimDigital, "TB"} unitRegistry["PB"] = UnitInfo{d(1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0), DimDigital, "PB"} unitRegistry["EB"] = UnitInfo{d(1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0), DimDigital, "EB"} // Area (Pivot: square meter) unitRegistry["M2"] = UnitInfo{d(1.0), DimArea, "m²"} unitRegistry["CM2"] = UnitInfo{d(1e-4), DimArea, "cm²"} unitRegistry["MM2"] = UnitInfo{d(1e-6), DimArea, "mm²"} unitRegistry["KM2"] = UnitInfo{d(1e6), DimArea, "km²"} unitRegistry["HA"] = UnitInfo{d(10000.0), DimArea, "ha"} unitRegistry["ACRE"] = UnitInfo{d(4046.8564), DimArea, "acre"} // Temperature (Pivot: Kelvin) unitRegistry["K"] = UnitInfo{d(1.0), DimTemp, "K"} unitRegistry["C"] = UnitInfo{d(1.0), DimTemp, "°C"} unitRegistry["F"] = UnitInfo{d(1.0), DimTemp, "°F"} unitRegistry["KELVIN"] = UnitInfo{d(1.0), DimTemp, "K"} unitRegistry["CELSIUS"] = UnitInfo{d(1.0), DimTemp, "°C"} unitRegistry["FAHRENHEIT"] = UnitInfo{d(1.0), DimTemp, "°F"} // Angle (Pivot: Radian) unitRegistry["RAD"] = UnitInfo{d(1.0), DimAngle, "rad"} unitRegistry["DEG"] = UnitInfo{d(math.Pi / 180.0), DimAngle, "deg"} unitRegistry["GRAD"] = UnitInfo{d(math.Pi / 200.0), DimAngle, "grad"} unitRegistry["RADIAN"] = UnitInfo{d(1.0), DimAngle, "rad"} unitRegistry["DEGREE"] = UnitInfo{d(math.Pi / 180.0), DimAngle, "deg"} unitRegistry["DEGREES"] = UnitInfo{d(math.Pi / 180.0), DimAngle, "deg"} unitRegistry["GRADIAN"] = UnitInfo{d(math.Pi / 200.0), DimAngle, "grad"} } // getDimName returns a human-readable string for a dimension. func getDimName(d Dimension) string { switch d { case DimCurrency: return "Currency" case DimLength: return "Length" case DimMass: return "Mass" case DimTime: return "Time" case DimDigital: return "Digital Storage" case DimArea: return "Area" case DimTemp: return "Temperature" case DimAngle: return "Angle" default: return "Number" } }