/// <summary> /// Reads the next number as a <see cref="double"/>. /// </summary> /// <param name="reader">A <see cref="TextReader" /> object.</param> /// <returns>The next number as a <see cref="double"/>; or <c>null</c> if reading fails.</returns> public static double?ReadNumber(this TextReader reader) { int ci; var negative = false; double num = 0; while ((ci = reader.Read()) != -1) { var c = (char)ci; if (ci == '+') { c = reader.ReadNonWhitespace(); if (!c.IsASCIIDigit()) { return(null); } num = c - '0'; break; } else if (ci == '-') { negative = true; c = reader.ReadNonWhitespace(); if (!c.IsASCIIDigit()) { return(null); } num = c - '0'; break; } else if (c.IsASCIIDigit()) { num = c - '0'; break; } } while ((ci = reader.Read()) != -1 && ((char)ci).IsASCIIDigit()) { num = num * 10 + ci - '0'; } if (ci == '.') { double @base = 10; while ((ci = reader.Read()) != -1 && ((char)ci).IsASCIIDigit()) { num += (ci - '0') / @base; @base *= 10; } } return(negative ? -num : num); }
/// <summary> /// Reads the next integer at most 32-bit large. /// </summary> /// <param name="reader">A <see cref="TextReader" /> object.</param> /// <returns>The next integer; or <c>null</c> if reading fails.</returns> public static int?ReadInteger(this TextReader reader) { int ci; var negative = false; int num = 0; while ((ci = reader.Read()) != -1) { var c = (char)ci; if (ci == '+') { c = reader.ReadNonWhitespace(); if (!c.IsASCIIDigit()) { return(null); } num = c - '0'; break; } else if (ci == '-') { negative = true; c = reader.ReadNonWhitespace(); if (!c.IsASCIIDigit()) { return(null); } num = c - '0'; break; } else if (c.IsASCIIDigit()) { num = c - '0'; break; } } while ((ci = reader.Read()) != -1 && ((char)ci).IsASCIIDigit()) { num = num * 10 + ci - '0'; } return(negative ? -num : num); }