double OsmAnd::Utilities::parseLength(const QString& value, double defValue, bool* wasParsed/* = nullptr*/) { int first, last; if (wasParsed) *wasParsed = false; if (!extractFirstNumberPosition(value, first, last, false, true)) return defValue; bool ok; auto result = value.midRef(first, last - first + 1).toDouble(&ok); if (!ok) return defValue; if (wasParsed) *wasParsed = true; if (value.contains(QLatin1String("ft")) || value.contains('"')) result *= 0.3048; if (value.contains('\'')) { auto inchesSubstr = value.mid(value.indexOf('"') + 1); if (!extractFirstNumberPosition(inchesSubstr, first, last, false, true)) { if (wasParsed) *wasParsed = false; return defValue; } bool ok; auto inches = inchesSubstr.midRef(first, last - first + 1).toDouble(&ok); if (ok) result += inches * 0.0254; } return result; }
double OsmAnd::Utilities::parseSpeed(const QString& value, double defValue, bool* wasParsed/* = nullptr*/) { if (value == QLatin1String("none")) { if (wasParsed) *wasParsed = true; return 40; } int first, last; if (!extractFirstNumberPosition(value, first, last, false, true)) { if (wasParsed) *wasParsed = false; return defValue; } bool ok; auto result = value.mid(first, last - first + 1).toDouble(&ok); if (wasParsed) *wasParsed = ok; if (!ok) return defValue; result /= 3.6; if (value.contains(QLatin1String("mph"))) result *= 1.6; return result; }
float OsmAnd::Utilities::parseArbitraryFloat(const QString& value, float defValue, bool* wasParsed /*= nullptr*/) { int first, last; if (wasParsed) *wasParsed = false; if (!extractFirstNumberPosition(value, first, last, true, true)) return defValue; bool ok; auto result = value.mid(first, last - first + 1).toFloat(&ok); if (!ok) return defValue; if (wasParsed) *wasParsed = true; return result; }
unsigned long OsmAnd::Utilities::parseArbitraryULong(const QString& value, unsigned long defValue, bool* wasParsed/* = nullptr*/) { int first, last; if (wasParsed) *wasParsed = false; if (!extractFirstNumberPosition(value, first, last, false, false)) return defValue; bool ok; auto result = value.midRef(first, last - first + 1).toULong(&ok); if (!ok) return defValue; if (wasParsed) *wasParsed = true; return result; }
double OsmAnd::Utilities::parseWeight(const QString& value, double defValue, bool* wasParsed/* = nullptr*/) { int first, last; if (wasParsed) *wasParsed = false; if (!extractFirstNumberPosition(value, first, last, false, true)) return defValue; bool ok; auto result = value.mid(first, last - first + 1).toDouble(&ok); if (!ok) return defValue; if (wasParsed) *wasParsed = true; if (value.contains(QLatin1String("lbs"))) result = (result * 0.4535) / 1000.0; // lbs -> kg -> ton return result; }