У меня есть QString «s150 d300». Как я могу получить числа из QString и преобразовать их в целое число. Простое использование toInt не работает.
Допустим, из QString «s150 d300», только число после алфавита ‘d’ имеет значение для меня. Так как я могу извлечь значение ‘300’ из строки?
Большое спасибо за уделенное время.
Одним из возможных решений является использование регулярных выражений, как показано ниже:
#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str = "s150 dd300s150 d301d302s15";
QRegExp rx("d(\\d+)");
QList<int> list;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
list << rx.cap(1).toInt();
pos += rx.matchedLength();
}
qDebug()<<list;
return a.exec();
}
Выход:
(300, 301, 302)
Благодаря комментарию @IlBeldus и по информации QRegExp будет осуждается, поэтому я предлагаю решение с использованием QRegularExpression
:
Другое решение:
QString str = "s150 dd300s150 d301d302s15";
QRegularExpression rx("d(\\d+)");
QList<int> list;
QRegularExpressionMatchIterator i = rx.globalMatch(str);
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
QString word = match.captured(1);
list << word.toInt();
}
qDebug()<<list;
Выход:
(300, 301, 302)
Если ваша строка разбита на разделенные пробелами токены, как в приведенном вами примере, вы можете просто извлечь из нее значение, разделив его, затем найти токен, который соответствует вашим потребностям, и затем взять числовую часть. Я использовал atoi после преобразования qstring в то, что мне удобнее, но я думаю, что есть более эффективный способ.
Хотя это не так гибко, как регулярные выражения, оно должно повысить производительность для предоставленного вами примера.
#include <QCoreApplication>
int main() {
QString str = "s150 d300";
// foreach " " space separated token in the string
for (QString token : str.split(" "))
// starts with d and has number
if (token[0] == 'd' && token.length() > 1)
// print the number part of it
qDebug() <<atoi(token.toStdString().c_str() + 1);
}
Почему все проблемы, если вы можете просто сделать:
#include <QDebug>
#include <QString>
const auto serialNumberStr = QStringLiteral("s150 d300");
int main()
{
const QRegExp rx(QLatin1Literal("[^0-9]+"));
const auto&& parts = serialNumberStr.split(rx, QString::SkipEmptyParts);
qDebug() << "2nd nbr:" << parts[1];
}
Распечатывает: 2nd nbr: "300"
Уже есть ответы, дающие подходящее решение этой проблемы, но я думаю, что было бы также полезно подчеркнуть, что QString::toInt
не будет работать, потому что преобразуемая строка должна быть текстовым представлением числа, а в данном примере это буквенно-цифровое выражение в нестандартной записи, поэтому необходимо вручную обработать ее, как уже было предложено, чтобы сделайте это «понятным» для Qt, чтобы выполнить преобразование.