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"
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"
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.
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());
}
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
Sì. È corretto, è un solo liner, ma si dovrebbe sempre verificare tali operazioni. –
Sui commenti:
sscanf(Abcd, "%f %s", &f,&s);
dà un errore.
Questa è la strada giusta:
sscanf(Abcd, "%f %s", &f,qPrintable(s));
OP sta chiedendo di Qt, e sscanf non è Qt –
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
}
}
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
Usa .toInt()
per int .toFloat()
per galleggiante e .toDouble()
per doppia
è possibile utilizzare:
QString str = "10";
int n = str.toInt();
uscita:
n = 10
lo stesso della maggior parte delle risposte, per me è una risposta ridondante. – eyllanesc
'sscanf (" 123.5 Kb ","% f% s ", &f,&s);' –
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
123.5 non è un numero intero (anche senza il Kb) - sei sicuro di volerlo? –