Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        /// <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));
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        /// <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);
        }