2013-05-19 8 views
42

Ho un QString nelle mie fonti. Quindi ho bisogno di convertirlo in numero intero senza "Kb".Come convertire QString in int?

Ho provato Abcd.toInt() ma non funziona.

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); Errore: impossibile convertire "QString" in "const char *" per l'argomento "1" su "int sscanf (const char *, const char *, ...)" – user2398614

+1

123.5 non è un numero intero (anche senza il Kb) - sei sicuro di volerlo? –

risposta

7

La stringa qui contenuta contiene un numero in virgola mobile con un'unità. Suggerirei di dividere quella stringa in un numero e una parte di unità con QString::split().

Quindi utilizzare toDouble() per ottenere un numero a virgola mobile e arrotondare come si desidera.

74

Non si dispone di tutti i caratteri numerici nella stringa. Quindi devi raggruppati per lo spazio

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 

Aggiornamento: sto aggiornando un vecchio risposta. Questa è stata una risposta diretta alla domanda specifica, con un assunto rigoroso. Tuttavia, come notato da @DomTomCat nei commenti e @Mikhail nella risposta, in generale si dovrebbe sempre verificare se l'operazione ha esito positivo o meno. Quindi è necessario usare una bandiera booleana.

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

anche se si stanno assumendo che stringa come input dell'utente, allora si dovrebbe anche essere dubbi sul fatto che la stringa è davvero scindibile con lo spazio. Se esiste la possibilità che l'ipotesi si interrompa, è preferibile un regex verifier. Una regex come la seguente estrarrà il valore in virgola mobile e il carattere prefisso di 'b'. Quindi puoi tranquillamente convertire le stringhe catturate in due.

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

si può avere una funzione di utilità come la seguente

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

Sebbene questa risposta sia ok per l'esempio specifico del richiedente, mi manca il test di successo della risposta di @ Mikhail, che dovrebbe sempre essere controllata. – DomTomCat

+0

Sì. È corretto, è un solo liner, ma si dovrebbe sempre verificare tali operazioni. –

-2

Sui commenti:

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

dà un errore.

Questa è la strada giusta:

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

OP sta chiedendo di Qt, e sscanf non è Qt –

0

Come suggerimento, è anche possibile utilizzare il QChar::digitValue() per ottenere il valore numerico della cifra. Per esempio:

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

Fonte: Converting one element from a QString to int

5

Non dimenticare di controllare se la conversione ha avuto successo!

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

Usa .toInt() per int .toFloat() per galleggiante e .toDouble() per doppia

toInt();

-1

è possibile utilizzare:

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

uscita:

n = 10 
+2

lo stesso della maggior parte delle risposte, per me è una risposta ridondante. – eyllanesc