initial commit [141.14.140.180,mike]

This commit is contained in:
2026-07-27 16:14:41 +02:00
commit 917a3d41ac
18 changed files with 3587 additions and 0 deletions
+108
View File
@@ -0,0 +1,108 @@
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"
}
}