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"
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"
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.
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());
}
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
Ja, das ist richtig, es ist ein Liner, aber ja sollte man solche Operationen immer überprüfen –
Auf den Kommentaren:
sscanf(Abcd, "%f %s", &f,&s);
Gibt einen Fehler.
Dies ist der richtige Weg:
sscanf(Abcd, "%f %s", &f,qPrintable(s));
OP fragt nach Qt, und sscanf ist nicht Qt –
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
}
}
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
Verwenden .toInt()
für int .toFloat()
für Schwimmer und .toDouble()
für Doppel
Sie verwenden können:
QString str = "10";
int n = str.toInt();
Ausgang:
n = 10
das gleiche wie die meisten Antworten vorschlagen, für mich ist es eine redundante Antwort. – eyllanesc
'sscanf (" 123,5 Kb ","% f% s ", &f,&s);' –
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
123.5 ist keine Ganzzahl (auch ohne Kb) - willst du das wirklich? –