Mam QString
w moich źródłach. Więc muszę przekonwertować go na liczbę całkowitą bez "Kb".Jak przekonwertować QString do int?
Próbowałem Abcd.toInt()
, ale to nie działa.
QString Abcd = "123.5 Kb"
Mam QString
w moich źródłach. Więc muszę przekonwertować go na liczbę całkowitą bez "Kb".Jak przekonwertować QString do int?
Próbowałem Abcd.toInt()
, ale to nie działa.
QString Abcd = "123.5 Kb"
Ciąg, który tu masz, zawiera liczbę zmiennoprzecinkową z jednostką. Zaleciłbym podzielenie tego ciągu na liczbę i część jednostki z QString::split()
.
Następnie użyj toDouble()
, aby uzyskać liczbę zmiennoprzecinkową i okrągłą, jak chcesz.
Nie masz wszystkich cyfr w łańcuchu znaków. Więc trzeba podzielić przez przestrzeń
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
aktualizacji: Mam aktualizacji starą odpowiedź. To była prosta odpowiedź na konkretne pytanie, przy ścisłym założeniu. Jednak jak zauważył @DomTomCat w komentarzach i @Mikhail w odpowiedzi, Zasadniczo należy zawsze sprawdzić, czy operacja zakończyła się powodzeniem, czy też nie. Dlatego konieczne jest użycie flagi boolowskiej.
bool flag;
double v = Abcd.split(" ")[0].toDouble(&flag);
if(flag){
// use v
}
Również jeśli pacjent przyjmuje, że ciąg jako danych wejściowych użytkownika, to powinno być również wątpliwości co do tego, czy ciąg jest naprawdę splitable z przestrzenią. Jeśli istnieje prawdopodobieństwo, że założenie może zostać złamane, bardziej odpowiedni jest weryfikator regex. Wyrażenie regularne, takie jak poniższe, wyodrębni wartość zmiennoprzecinkową i znak prefiksu "b". Następnie możesz bezpiecznie przekonwertować przechwycone łańcuchy na podwójne.
([0-9]*\.?[0-9]+)\s+(\w[bB])
Można mieć funkcję użytkową jak na poniższym
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());
}
Mimo że ta odpowiedź jest w porządku dla konkretnego przykładu pytającego, brakuje mi testu powodzenia odpowiedzi @ Mikhaila, która zawsze powinna być sprawdzana. – DomTomCat
Tak. to prawda. jest to jeden liner. Ale tak należy zawsze zweryfikować takie operacje –
na komentarze:
sscanf(Abcd, "%f %s", &f,&s);
daje błąd.
To jest właściwa droga:
sscanf(Abcd, "%f %s", &f,qPrintable(s));
OP prosi o Qt, a sscanf nie jest Qt –
jako sugestię, można również użyć QChar::digitValue()
aby uzyskać wartość liczbową cyfra. Na przykład:
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
}
}
Nie zapomnij sprawdzić, czy konwersja powiodła się!
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
Zastosowanie .toInt()
dla int .toFloat()
dla pływaka i .toDouble()
o podwójnym
można użyć:
QString str = "10";
int n = str.toInt();
wyjściowa:
n = 10
samo jak większość odpowiedzi zaproponować, dla mnie jest to zbędne odpowiedź. – eyllanesc
'sscanf (" 123.5 Kb ","% f% s ", &f,&s);' –
QString Abcd = "123.5 Kb"; float f; QString s; sscanf (ABCD, "% f% s", &f,&s); Błąd: Nie można konwertować "QString" do "const char *" dla argumentu "1" do "int sscanf (const char *, const char *, ...)" – user2398614
123,5 nie jest liczbą całkowitą (nawet bez Kb) - czy na pewno tego chcesz? –