PQ string parsing improvements

This commit is contained in:
Klaus Basan
2018-08-09 03:43:57 +02:00
parent 92880bce7f
commit ee181d6425
2 changed files with 16 additions and 19 deletions

View File

@@ -31,7 +31,7 @@ namespace BlackMisc
{ {
QString CPqString::convertToQString(bool /** i18n **/) const QString CPqString::convertToQString(bool /** i18n **/) const
{ {
return this->m_string; return m_string;
} }
CVariant CPqString::parseToVariant(const QString &value, SeparatorMode mode) CVariant CPqString::parseToVariant(const QString &value, SeparatorMode mode)
@@ -45,68 +45,68 @@ namespace BlackMisc
if (vs.isEmpty()) { return v; } if (vs.isEmpty()) { return v; }
thread_local const QRegularExpression regex("([-+]?[0-9]*[\\.,]?[0-9]+)\\s*(\\D*)$"); thread_local const QRegularExpression regex("([-+]?[0-9]*[\\.,]?[0-9]+)\\s*(\\D*)$");
auto match = regex.match(value); const auto match = regex.match(value);
if (!match.hasMatch()) { return v; } // not a valid number if (!match.hasMatch()) { return v; } // not a valid number
QString unit = match.captured(2).trimmed(); QString unit = match.captured(2).trimmed();
QString number = QString(value).replace(unit, ""); const QString number = QString(value).replace(unit, "");
unit = unit.trimmed(); // trim after replace, not before unit = unit.trimmed(); // trim after replace, not before
if (unit.isEmpty() || number.isEmpty()) { return v; } if (unit.isEmpty() || number.isEmpty()) { return v; }
bool success; bool success;
double numberD = parseNumber(number, success, mode); const double numberD = parseNumber(number, success, mode);
if (!success) {return v; } if (!success) {return v; }
if (CMeasurementUnit::isValidUnitSymbol<CAccelerationUnit>(unit)) if (CMeasurementUnit::isValidUnitSymbol<CAccelerationUnit>(unit))
{ {
CAcceleration pq(numberD, CMeasurementUnit::unitFromSymbol<CAccelerationUnit>(unit, false)); const CAcceleration pq(numberD, CMeasurementUnit::unitFromSymbol<CAccelerationUnit>(unit, false));
return CVariant::from(pq); return CVariant::from(pq);
} }
if (CMeasurementUnit::isValidUnitSymbol<CAngleUnit>(unit)) if (CMeasurementUnit::isValidUnitSymbol<CAngleUnit>(unit))
{ {
CAngle pq(numberD, CMeasurementUnit::unitFromSymbol<CAngleUnit>(unit, false)); const CAngle pq(numberD, CMeasurementUnit::unitFromSymbol<CAngleUnit>(unit, false));
return CVariant::from(pq); return CVariant::from(pq);
} }
if (CMeasurementUnit::isValidUnitSymbol<CFrequencyUnit>(unit)) if (CMeasurementUnit::isValidUnitSymbol<CFrequencyUnit>(unit))
{ {
CFrequency pq(numberD, CMeasurementUnit::unitFromSymbol<CFrequencyUnit>(unit, false)); const CFrequency pq(numberD, CMeasurementUnit::unitFromSymbol<CFrequencyUnit>(unit, false));
return CVariant::from(pq); return CVariant::from(pq);
} }
if (CMeasurementUnit::isValidUnitSymbol<CLengthUnit>(unit)) if (CMeasurementUnit::isValidUnitSymbol<CLengthUnit>(unit))
{ {
CLength pq(numberD, CMeasurementUnit::unitFromSymbol<CLengthUnit>(unit, false)); const CLength pq(numberD, CMeasurementUnit::unitFromSymbol<CLengthUnit>(unit, false));
return CVariant::from(pq); return CVariant::from(pq);
} }
if (CMeasurementUnit::isValidUnitSymbol<CMassUnit>(unit)) if (CMeasurementUnit::isValidUnitSymbol<CMassUnit>(unit))
{ {
CMass pq(numberD, CMeasurementUnit::unitFromSymbol<CMassUnit>(unit, false)); const CMass pq(numberD, CMeasurementUnit::unitFromSymbol<CMassUnit>(unit, false));
return CVariant::from(pq); return CVariant::from(pq);
} }
if (CMeasurementUnit::isValidUnitSymbol<CPressureUnit>(unit)) if (CMeasurementUnit::isValidUnitSymbol<CPressureUnit>(unit))
{ {
CPressure pq(numberD, CMeasurementUnit::unitFromSymbol<CPressureUnit>(unit, false)); const CPressure pq(numberD, CMeasurementUnit::unitFromSymbol<CPressureUnit>(unit, false));
return CVariant::from(pq); return CVariant::from(pq);
} }
if (CMeasurementUnit::isValidUnitSymbol<CSpeedUnit>(unit)) if (CMeasurementUnit::isValidUnitSymbol<CSpeedUnit>(unit))
{ {
CSpeed pq(numberD, CMeasurementUnit::unitFromSymbol<CSpeedUnit>(unit, false)); const CSpeed pq(numberD, CMeasurementUnit::unitFromSymbol<CSpeedUnit>(unit, false));
return CVariant::from(pq); return CVariant::from(pq);
} }
if (CMeasurementUnit::isValidUnitSymbol<CTimeUnit>(unit)) if (CMeasurementUnit::isValidUnitSymbol<CTimeUnit>(unit))
{ {
CTime pq(numberD, CMeasurementUnit::unitFromSymbol<CTimeUnit>(unit, false)); const CTime pq(numberD, CMeasurementUnit::unitFromSymbol<CTimeUnit>(unit, false));
return CVariant::from(pq); return CVariant::from(pq);
} }
if (CMeasurementUnit::isValidUnitSymbol<CTemperatureUnit>(unit)) if (CMeasurementUnit::isValidUnitSymbol<CTemperatureUnit>(unit))
{ {
CTemperature pq(numberD, CMeasurementUnit::unitFromSymbol<CTemperatureUnit>(unit, false)); const CTemperature pq(numberD, CMeasurementUnit::unitFromSymbol<CTemperatureUnit>(unit, false));
return CVariant::from(pq); return CVariant::from(pq);
} }
return v; return v;
@@ -133,6 +133,5 @@ namespace BlackMisc
} }
return numberD; return numberD;
} }
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -62,16 +62,14 @@ namespace BlackMisc
//! Parse into concrete type //! Parse into concrete type
template <class PQ> static PQ parse(const QString &value, SeparatorMode mode = SeparatorsCLocale) template <class PQ> static PQ parse(const QString &value, SeparatorMode mode = SeparatorsCLocale)
{ {
PQ null; if (value.isEmpty()) {return PQ::null(); }
null.setNull(); if (value.contains("null", Qt::CaseInsensitive)) { return PQ::null(); }
if (value.isEmpty()) {return null; }
if (value.contains("null", Qt::CaseInsensitive)) { return null; }
const CVariant qv = parseToVariant(value, mode); const CVariant qv = parseToVariant(value, mode);
if (!qv.isNull() && qv.canConvert<PQ>()) if (!qv.isNull() && qv.canConvert<PQ>())
{ {
return qv.value<PQ>(); return qv.value<PQ>();
} }
return null; return PQ::null();
} }
//! Locale aware parsing //! Locale aware parsing