2013-05-19 16 views
42

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" 
+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); Błąd: Nie można konwertować "QString" do "const char *" dla argumentu "1" do "int sscanf (const char *, const char *, ...)" – user2398614

+1

123,5 nie jest liczbą całkowitą (nawet bez Kb) - czy na pewno tego chcesz? –

Odpowiedz

7

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.

74

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

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

+0

Tak. to prawda. jest to jeden liner. Ale tak należy zawsze zweryfikować takie operacje –

-2

na komentarze:

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

daje błąd.

To jest właściwa droga:

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

OP prosi o Qt, a sscanf nie jest Qt –

0

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 
    } 
} 

Źródło: Converting one element from a QString to int

5

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 
1

Zastosowanie .toInt() dla int .toFloat() dla pływaka i .toDouble() o podwójnym

toInt();

-1

można użyć:

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

wyjściowa:

n = 10 
+2

samo jak większość odpowiedzi zaproponować, dla mnie jest to zbędne odpowiedź. – eyllanesc