internal TQuantity Parse <TQuantity, TUnitType>([NotNull] string str, [CanBeNull] IFormatProvider formatProvider, [NotNull] QuantityFromDelegate <TQuantity, TUnitType> fromDelegate) where TQuantity : IQuantity where TUnitType : Enum { if (str == null) { throw new ArgumentNullException(nameof(str)); } str = str.Trim(); var numFormat = formatProvider != null ? (NumberFormatInfo)formatProvider.GetFormat(typeof(NumberFormatInfo)) : NumberFormatInfo.CurrentInfo; if (numFormat == null) { throw new InvalidOperationException($"No number format was found for the given format provider: {formatProvider}"); } var regex = CreateRegexForQuantity <TUnitType>(formatProvider); if (!ExtractValueAndUnit(regex, str, out var valueString, out var unitString)) { var ex = new FormatException("Unable to parse quantity. Expected the form \"{value} {unit abbreviation}\", such as \"5.5 m\". The spacing is optional."); ex.Data["input"] = str; throw ex; } return(ParseWithRegex(valueString, unitString, fromDelegate, formatProvider)); }
internal bool TryParse <TQuantity, TUnitType>([NotNull] string str, [CanBeNull] IFormatProvider formatProvider, [NotNull] QuantityFromDelegate <TQuantity, TUnitType> fromDelegate, out TQuantity result) where TQuantity : IQuantity where TUnitType : Enum { result = default; if (string.IsNullOrWhiteSpace(str)) { return(false); } str = str.Trim(); var numFormat = formatProvider != null ? (NumberFormatInfo)formatProvider.GetFormat(typeof(NumberFormatInfo)) : NumberFormatInfo.CurrentInfo; if (numFormat == null) { return(false); } var regex = CreateRegexForQuantity <TUnitType>(formatProvider); if (!ExtractValueAndUnit(regex, str, out var valueString, out var unitString)) { return(false); } return(TryParseWithRegex(valueString, unitString, fromDelegate, formatProvider, out result)); }
/// <summary> /// Parse a string given a particular regular expression. /// </summary> /// <exception cref="UnitsNetException">Error parsing string.</exception> private TQuantity ParseWithRegex <TQuantity, TUnitType>(string valueString, string unitString, QuantityFromDelegate <TQuantity, TUnitType> fromDelegate, IFormatProvider formatProvider) where TQuantity : IQuantity where TUnitType : Enum { var value = double.Parse(valueString, ParseNumberStyles, formatProvider); var parsedUnit = _unitParser.Parse <TUnitType>(unitString, formatProvider); return(fromDelegate(value, parsedUnit)); }
internal bool TryParse <TQuantity, TUnitType>([NotNull] string str, [CanBeNull] IFormatProvider formatProvider, [NotNull] QuantityFromDelegate <TQuantity, TUnitType> fromDelegate, out IQuantity result) where TQuantity : IQuantity where TUnitType : Enum { if (TryParse(str, formatProvider, fromDelegate, out TQuantity parsedQuantity)) { result = parsedQuantity; return(true); } result = default; return(false); }
/// <summary> /// Workaround for C# not allowing to pass on 'out' param from type Length to IQuantity, even though the are compatible. /// </summary> internal bool TryParse <TQuantity, TUnitType>(string str, IFormatProvider formatProvider, QuantityFromDelegate <TQuantity, TUnitType> fromDelegate, out IQuantity result) where TQuantity : struct, IQuantity where TUnitType : struct, Enum { if (TryParse(str, formatProvider, fromDelegate, out TQuantity parsedQuantity)) { result = parsedQuantity; return(true); } result = default; return(false); }
/// <summary> /// Parse a string given a particular regular expression. /// </summary> /// <exception cref="UnitsNetException">Error parsing string.</exception> private bool TryParseWithRegex <TQuantity, TUnitType>(string valueString, string unitString, QuantityFromDelegate <TQuantity, TUnitType> fromDelegate, IFormatProvider formatProvider, out TQuantity result) where TQuantity : IQuantity where TUnitType : Enum { result = default; if (!double.TryParse(valueString, ParseNumberStyles, formatProvider, out var value)) { return(false); } if (!_unitParser.TryParse <TUnitType>(unitString, formatProvider, out var parsedUnit)) { return(false); } result = fromDelegate(value, parsedUnit); return(true); }