/* Copyright (C) 2013 * swift project Community / Contributors * * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, * including this file, may be copied, modified, propagated, or distributed except according to the terms * contained in the LICENSE file. */ #include "pqstring.h" #include "tuple.h" #include "pqallquantities.h" #include namespace BlackMisc { namespace PhysicalQuantities { /* * Convert to string */ QString CPqString::convertToQString(bool /** i18n **/) const { return this->m_string; } /* * Parse */ CVariant CPqString::parseToVariant(const QString &value, SeparatorMode mode) { CVariant v; // fine tuning of the string QString vs = value.trimmed().simplified(); // check if (vs.isEmpty()) { return v; } static QThreadStorage tsRegex; if (! tsRegex.hasLocalData()) { tsRegex.setLocalData(QRegExp("([-+]?[0-9]*[\\.,]?[0-9]+)\\s*(\\D*)$")); } const auto ®ex = tsRegex.localData(); if (regex.indexIn(value) < 0) { return v; } // not a valid number QString unit = regex.cap(2).trimmed(); QString number = QString(value).replace(unit, ""); unit = unit.trimmed(); // trim after replace, not before if (unit.isEmpty() || number.isEmpty()) { return v; } bool success; double numberD = parseNumber(number, success, mode); if (!success) {return v; } if (CMeasurementUnit::isValidUnitSymbol(unit)) { CAcceleration pq(numberD, CMeasurementUnit::unitFromSymbol(unit, false)); return pq.toCVariant(); } if (CMeasurementUnit::isValidUnitSymbol(unit)) { CAngle pq(numberD, CMeasurementUnit::unitFromSymbol(unit, false)); return pq.toCVariant(); } if (CMeasurementUnit::isValidUnitSymbol(unit)) { CFrequency pq(numberD, CMeasurementUnit::unitFromSymbol(unit, false)); return pq.toCVariant(); } if (CMeasurementUnit::isValidUnitSymbol(unit)) { CLength pq(numberD, CMeasurementUnit::unitFromSymbol(unit, false)); return pq.toCVariant(); } if (CMeasurementUnit::isValidUnitSymbol(unit)) { CMass pq(numberD, CMeasurementUnit::unitFromSymbol(unit, false)); return pq.toCVariant(); } if (CMeasurementUnit::isValidUnitSymbol(unit)) { CPressure pq(numberD, CMeasurementUnit::unitFromSymbol(unit, false)); return pq.toCVariant(); } if (CMeasurementUnit::isValidUnitSymbol(unit)) { CSpeed pq(numberD, CMeasurementUnit::unitFromSymbol(unit, false)); return pq.toCVariant(); } if (CMeasurementUnit::isValidUnitSymbol(unit)) { CTime pq(numberD, CMeasurementUnit::unitFromSymbol(unit, false)); return pq.toCVariant(); } if (CMeasurementUnit::isValidUnitSymbol(unit)) { CTemperature pq(numberD, CMeasurementUnit::unitFromSymbol(unit, false)); return pq.toCVariant(); } return v; } double CPqString::parseNumber(const QString &number, bool &success, CPqString::SeparatorMode mode) { double numberD = -1; switch (mode) { case SeparatorsLocale: numberD = QLocale::system().toDouble(number, &success); break; case SeparatorsCLocale: numberD = number.toDouble(&success); break; case SeparatorsBestGuess: numberD = number.toDouble(&success); if (!success) numberD = QLocale::system().toDouble(number, &success); break; default: qFatal("Wrong mode"); break; } return numberD; } } // namespace } // namespace