private static Boolean TryParse(ReadOnlySpan <char> s, NumberStyles style, NumberFormatInfo info, out Single result) { bool success = Number.TryParseSingle(s, style, info, out result); if (!success) { ReadOnlySpan <char> sTrim = s.Trim(); if (sTrim.EqualsOrdinal(info.PositiveInfinitySymbol)) { result = PositiveInfinity; } else if (sTrim.EqualsOrdinal(info.NegativeInfinitySymbol)) { result = NegativeInfinity; } else if (sTrim.EqualsOrdinal(info.NaNSymbol)) { result = NaN; } else { return(false); // We really failed } } return(true); }
internal unsafe static double ParseDouble(ReadOnlySpan <char> value, NumberStyles options, NumberFormatInfo numfmt) { NumberBuffer number = default; double d = 0; if (!TryStringToNumber(value, options, ref number, numfmt, false)) { //If we failed TryStringToNumber, it may be from one of our special strings. //Check the three with which we're concerned and rethrow if it's not one of //those strings. ReadOnlySpan <char> sTrim = value.Trim(); if (sTrim.EqualsOrdinal(numfmt.PositiveInfinitySymbol)) { return(double.PositiveInfinity); } if (sTrim.EqualsOrdinal(numfmt.NegativeInfinitySymbol)) { return(double.NegativeInfinity); } if (sTrim.EqualsOrdinal(numfmt.NaNSymbol)) { return(double.NaN); } throw new FormatException(SR.Format_InvalidString); } if (!NumberBufferToDouble(ref number, ref d)) { throw new OverflowException(SR.Overflow_Double); } return(d); }