В вашем вопросе двойники в вашем тексте отформатированы с помощью десятичного разделителя запятой : 7,370618E+07
. Это означает, что в текущем языковом стандарте на вашем компьютере (представленном Thread.CurrentCulture
) используется этот разделитель.
Однако числа в файле XML отформатированы с использованием десятичного разделителя period : 737061.75
. double.Parse()
не будет анализировать их правильно, поскольку входная строка интерпретируется с использованием информации о форматировании в NumberFormatInfo
объекте, который инициализирован для текущей культуры потоков. Я смог воспроизвести эту проблему, используя скрипту здесь , изменив текущую версию на new CultureInfo("de-DE")
.
Поскольку файлы XML обычно форматируются с использованием инвариантной культуры, вы должны проанализировать, используя инвариантные настройки :
double startTimeValue = double.Parse(startTime, NumberFormatInfo.InvariantInfo);
double endTimeValue = double.Parse(endTime, NumberFormatInfo.InvariantInfo);
Или используйте System.Globalization.CultureInfo.InvariantCulture
:
double startTimeValue = double.Parse(startTime, System.Globalization.CultureInfo.InvariantCulture);
double endTimeValue = double.Parse(endTime, System.Globalization.CultureInfo.InvariantCulture);
Еще лучше использовать утилиты из XmlConvert
class:
double startTimeValue = XmlConvert.ToDouble(startTime);
double endTimeValue = XmlConvert.ToDouble(endTime);
Этот класс предоставляет методы для преобразования между типами среды выполнения общего языка и типами языка определения схемы XML (XSD). При преобразовании типов данных возвращаемые значения не зависят от локали. Таким образом, он инкапсулирует подробности о соглашениях XML для форматирования примитивных типов.
Демонстрационная скрипта # 2, показывающая вышеуказанные исправления здесь .
В качестве другой, еще более простой альтернативы попробуйте выполнить синтаксический анализ вашего XML с помощью LINQ to XML :
var doc = XDocument.Load(_projectFilePath);
var startTimeValue = (double)doc.Root.Attribute("start_datetime");
var endTimeValue = (double)doc.Root.Attribute("end_datetime");
LINQ to XML XATtribute
поддерживает прямое приведение к double
или decimal
, устраняя необходимость в ручном разборе.
Демонстрационная скрипка # 3 здесь .
Наконец, в вашем коде вы делаете:
double endTimeValue = double.Parse(startTime);
Я предполагаю, что это опечатка в вашем вопросе и должно быть вместо:
double endTimeValue = double.Parse(endTime);