Предполагая, что эффективность не слишком важна, а также предполагая, что вы всегда ожидаете, что число начинается с НАЧАЛА строки, а не частично:
public static (double result, int consumed) ParseLongestNumber(string s)
{
for (int n = s.Length; n > 0; --n)
{
string t = s.Substring(0, n);
if (double.TryParse(t, out var r))
return (r, n);
}
return (double.NaN, 0);
}
Это должно обрабатывать всечисловые форматы, например, ParseLongestNumber("-1.42e3;3.14")
вернет (-1420, 7)
.
Если число не может быть проанализировано, оно вернет (NaN, 0)
.
(Примечание. Вы не сказали, чтоИспользовали старую версию C # - если да, вам придется возвращать результаты с помощью параметров out
или с помощью экспликации Tuple
, а не через кортежи нового стиля.)
ВозможноОптимизация заключается в том, чтобы найти последний возможный числовой символ и проанализировать его только до этого:
public static (double result, int consumed) ParseLongestNumber(string s)
{
const string NUMBER_CHARS = "+-.,e0123456789";
int n = 0;
while (n < s.Length)
if (NUMBER_CHARS.IndexOf(s[n]) < 0)
break;
else
++n;
for (; n > 0; --n)
{
string t = s.Substring(0, n);
if (double.TryParse(t, out var r))
return (r, n);
}
return (double.NaN, 0);
}
Является ли эта опция на самом деле полезной, можно определить только путем эмпирического тестирования.