From af119ff7109872773b2722de12e7ce1435d8a135 Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Mon, 3 Dec 2012 21:51:05 +0000 Subject: [PATCH] TCX Parser: Strtod is locale specific When parsing in locale's where numbers use a ',' as a decimal point, strtod fails to parse lon/lat values. Thanks to Horst Huschauer for the fix. Fixes #365. --- src/TcxParser.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/TcxParser.cpp b/src/TcxParser.cpp index 45e1913a2..b70f5592a 100644 --- a/src/TcxParser.cpp +++ b/src/TcxParser.cpp @@ -104,9 +104,20 @@ TcxParser::endElement( const QString&, const QString&, const QString& qName) else if (qName == "Value") { hr = buffer.toDouble(); } else if (qName == "Cadence") { cadence = buffer.toDouble(); } else if (qName == "AltitudeMeters") { alt = buffer.toDouble(); } - else if (qName == "LongitudeDegrees") { char *p; lon = strtod(buffer.toLatin1(), &p); } - else if (qName == "LatitudeDegrees") { char *p; lat = strtod(buffer.toLatin1(), &p); } - else if (qName == "Trackpoint") { + else if (qName == "LongitudeDegrees") { + + char *p; + setlocale(LC_NUMERIC,"C"); // strtod is locale dependent! + lon = strtod(buffer.toLatin1(), &p); + setlocale(LC_NUMERIC,""); + + } else if (qName == "LatitudeDegrees") { + char *p; + setlocale(LC_NUMERIC,"C"); // strtod is locale dependent! + lat = strtod(buffer.toLatin1(), &p); + setlocale(LC_NUMERIC,""); + + } else if (qName == "Trackpoint") { // Some TCX files have Speed, some have Distance // Lets derive Speed from Distance or vice-versa