2017-07-26 103 views
1

我有一個QString爲「s150 d300」。我如何從QString獲取數字並將其轉換爲整數。簡單地使用'toInt'不起作用。從字母數字QString中提取數字

讓說,從「S150 D300」的QString的,只有字母「d」後數量是有意義的我。那麼如何從字符串中提取'300'的值呢?

非常感謝您的時間。

回答

3

一種可能的解決方案是使用正則表達式,如下所示:

#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將deprecated,所以我建議使用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) 
+0

QRegExp在Qt5中不推薦使用,應該使用QRegularExpression。來自Qt論壇的重複問題:https://forum.qt.io/topic/81717/extract-number-from-an-alphanumeric-qstring – IlBeldus

+0

這兩個版本仍然支持,看看這個:http://doc.qt。 io/qt-5/qregexp.html和http://doc.qt.io/qt-5/qregularexpression.html。 – eyllanesc

+0

另外它不是重複的,我已經在2小時前回復了,相反論壇已經在15分鐘前解決了。 – eyllanesc

2

如果字符串被分成就像你給了你可以簡單地通過拆分它,然後找到能夠滿足您需求的令牌獲得價值了它的例子空間分隔的記號然後把它的數字部分。在將qstring轉換爲我更舒適的東西之後,我使用了atoi,但我認爲這是一種更有效的方法。

雖然這不像正則表達式那樣靈活,但它應該爲您提供的示例提供更好的性能。

#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); 
} 
0

現在已經有解答了給一個合適的解決這個問題,但我認爲這可能是也很有幫助強調,QString::toInt不會起作用,因爲該字符串被轉換應該是在一些與文字表述給出的例子是一個非標準表示法中的字母數字表達式,因此有必要按照已經建議的那樣手動處理它,以便讓Qt執行轉換「不可擴展」。