2013-05-19 4 views
42

Ich habe eine QString in meinen Quellen. Also muss ich es in Ganzzahl ohne "Kb" konvertieren.Wie konvertiert man QString zu int?

Ich versuchte Abcd.toInt(), aber es funktioniert nicht.

QString Abcd = "123.5 Kb" 
+1

'sscanf (" 123,5 Kb ","% f% s ", &f,&s);' –

+0

QString Abcd = "123,5 Kb"; float f; QString s; sscanf (Abcd, "% f% s", &f,&s); Fehler: Kann "QString" nicht konvertieren zu "const char *" für Argument "1" zu "int sscanf (const char *, const char *, ...)" – user2398614

+1

123.5 ist keine Ganzzahl (auch ohne Kb) - willst du das wirklich? –

Antwort

7

Die Zeichenfolge, die Sie hier haben, enthält eine Gleitkommazahl mit einer Einheit. Ich würde empfehlen, diese Zeichenfolge in eine Nummer und einen Einheitsteil mit QString::split() zu teilen.

Verwenden Sie dann toDouble(), um eine Gleitkommazahl und eine Rundung zu erhalten, wie Sie möchten.

74

Sie haben nicht alle Ziffern in Ihrer Zeichenfolge. Also muss man durch den Raum geteilt

QString Abcd = "123.5 Kb"; 
Abcd.split(" ")[0].toInt(); //convert the first part to Int 
Abcd.split(" ")[0].toDouble(); //convert the first part to double 
Abcd.split(" ")[0].toFloat(); //convert the first part to float 

aktualisieren: ich eine alte Antwort bin zu aktualisieren. Das war eine direkte Antwort auf die spezifische Frage, mit einer strengen Annahme. Wie jedoch von @DomTomCat in Kommentaren und @Mikhail als Antwort bemerkt, sollte man generell immer überprüfen, ob der Vorgang erfolgreich ist oder nicht. Daher ist es notwendig, ein boolesches Flag zu verwenden.

bool flag; 
double v = Abcd.split(" ")[0].toDouble(&flag); 
if(flag){ 
    // use v 
} 

Auch wenn Sie diese Zeichenfolge als Benutzereingabe einnehmen, dann sollten Sie auch über zweifelhaft sein, ob die Saite wirklich aufteilbar mit dem Raum. Wenn die Möglichkeit besteht, dass die Annahme bricht, ist ein Regex-Verifizierer bevorzugter. Eine Regex wie die folgende extrahiert den Fließkommawert und das Präfixzeichen von 'b'. Dann können Sie die aufgenommenen Strings sicher in das Doppelte konvertieren.

([0-9]*\.?[0-9]+)\s+(\w[bB]) 

Sie können eine Nutzenfunktion wie die haben folgende

QPair<double, QString> split_size_str(const QString& str){ 
    QRegExp regex("([0-9]*\\.?[0-9]+)\\s+(\\w[bB])"); 
    int pos = regex.indexIn(str); 
    QStringList captures = regex.capturedTexts(); 
    if(captures.count() > 1){ 
     double value = captures[1].toDouble(); // should succeed as regex matched 
     QString unit = captures[2]; // should succeed as regex matched 
     return qMakePair(value, unit); 
    } 
    return qMakePair(0.0f, QString()); 
} 
+0

Obwohl diese Antwort für das spezielle Beispiel des Fragestellers in Ordnung ist, fehlt mir der Erfolgstest von @Michails Antwort, die immer überprüft werden sollte. – DomTomCat

+0

Ja, das ist richtig, es ist ein Liner, aber ja sollte man solche Operationen immer überprüfen –

-2

Auf den Kommentaren:

sscanf(Abcd, "%f %s", &f,&s); 

Gibt einen Fehler.

Dies ist der richtige Weg:

sscanf(Abcd, "%f %s", &f,qPrintable(s)); 
+5

OP fragt nach Qt, und sscanf ist nicht Qt –

0

Als Anregung, können Sie auch die QChar::digitValue() können den numerischen Wert der Ziffer zu erhalten. Zum Beispiel:

for (int var = 0; var < myString.length(); ++var) { 
    bool ok; 
    if (myString.at(var).isDigit()){ 
     int digit = myString.at(var).digitValue(); 
     //DO SOMETHING HERE WITH THE DIGIT 
    } 
} 

Quelle: Converting one element from a QString to int

5

Vergessen Sie nicht, zu überprüfen, ob die Konvertierung erfolgreich war!

bool ok; 
auto str= tr("1337"); 
str.toDouble(&ok); // returns 1337.0, ok set to true 
auto strr= tr("LEET"); 
strr.toDouble(&ok); // returns 0.0, ok set to false 
1

Verwenden .toInt() für int .toFloat() für Schwimmer und .toDouble() für Doppel

toInt();

-1

Sie verwenden können:

QString str = "10"; 
int n = str.toInt(); 

Ausgang:

n = 10 
+2

das gleiche wie die meisten Antworten vorschlagen, für mich ist es eine redundante Antwort. – eyllanesc