namespace InnovEnergy.Lib.Units; public abstract class Unit { protected Unit(Double value) => Value = value; public abstract String Symbol { get; } public Double Value { get; } public override String ToString() => $"{Value} {Symbol}"; public String ToDisplayString() { if (Value == 0) return $"0 {Symbol}"; var a = Math.Abs(Value); var s = Math.Sign(Value); var i = 8; while (a >= 10000) { a /= 1000; i++; } while (a < 10) { a *= 1000; i--; } var r = a < 100 ? Math.Floor(a * 10) / 10 : Math.Floor(a); return $"{r * s} {Prefix[i]}{Symbol}"; } private static readonly IReadOnlyList Prefix = new[] { "y", "z", "a", "f", "p", "n", "ยต", "m", "", "k", "M", "G", "T", "P", "E", "Y" }; }