public static bool TryGet(string abbreviation, out KalkUnitPrefix descriptor) { if (abbreviation == null) { throw new ArgumentNullException(nameof(abbreviation)); } return(MapAbbreviationToDescriptor.TryGetValue(abbreviation, out descriptor)); }
public KalkExpression RegisterUnit(KalkUnit unit, string description = null, string symbol = null, KalkExpression value = null, string plural = null, string prefix = null, bool isUser = false) { if (unit == null) { throw new ArgumentNullException(nameof(unit)); } var name = unit.Name; symbol ??= name; // Override isUser if (_registerAsSystem) { isUser = false; } CheckVariableAvailable(name, nameof(name), false); var prefixList = new List <KalkUnitPrefix>(); if (prefix != null) { var prefixes = prefix.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var prefixItem in prefixes) { if (prefixItem == "decimal") { prefixList.AddRange(KalkUnitPrefix.GetDecimals()); } else if (prefixItem == "binary") { prefixList.AddRange(KalkUnitPrefix.GetBinaries()); } else if (KalkUnitPrefix.TryGet(prefixItem, out var descriptor)) { prefixList.Add(descriptor); } else { throw new ArgumentException($"The prefix `{prefixItem}` does not exist.", nameof(prefix)); } } prefixList = prefixList.Distinct().ToList(); } // Pre-check all prefix with name/symbol foreach (var prefixDesc in prefixList) { var prefixWithName = $"{prefixDesc.Name}{name}"; CheckVariableAvailable(prefixWithName, nameof(name), false); var prefixWithSymbol = $"{prefixDesc.Prefix}{symbol}"; CheckVariableAvailable(prefixWithSymbol, nameof(name), false); } unit.Description = description; unit.Symbol = symbol; unit.Value = value; unit.IsUser = isUser; unit.Prefix = prefix; if (plural != null) { unit.Plural = plural; } if (unit.Symbol != unit.Name) { CheckVariableAvailable(unit.Symbol, nameof(symbol), false); } if (unit.Plural != unit.Name) { CheckVariableAvailable(unit.Plural, nameof(plural), false); } // Here we are all done after checking everything Units.Add(name, unit); if (unit.Symbol != unit.Name) { Units.Add(unit.Symbol, unit); } if (unit.Plural != unit.Name) { Units.Add(unit.Plural, unit); } // Register prefixes foreach (var prefixDesc in prefixList) { var prefixWithName = $"{prefixDesc.Name}{unit.Name}"; var prefixWithSymbol = $"{prefixDesc.Prefix}{unit.Symbol}"; var unitPrefix = new KalkUnit(prefixWithName) { Description = description, Symbol = prefixWithSymbol, Value = new KalkBinaryExpression(Math.Pow(prefixDesc.Base, prefixDesc.Exponent), ScriptBinaryOperator.Multiply, unit), IsUser = isUser, Parent = unit, }; unit.Derived.Add(unitPrefix); Units.Add(prefixWithName, unitPrefix); Units.Add(prefixWithSymbol, unitPrefix); } return(unit); }