web-dev-qa-db-fra.com

Comment convertir QString en int?

J'ai un QString dans mes sources. J'ai donc besoin de le convertir en entier sans "Kb".

J'ai essayé Abcd.toInt() mais cela ne fonctionne pas.

QString Abcd = "123.5 Kb"
54
user2398614

Vous n'avez pas tous les caractères numériques dans votre chaîne. Donc, vous devez diviser par espace

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

Mise à jour: Je mets à jour une ancienne réponse. C'était une réponse directe à la question spécifique, avec une hypothèse stricte. Cependant, comme noté par @DomTomCat dans les commentaires et par @Mikhail dans sa réponse, il convient en général de toujours vérifier si l'opération est réussie ou non. Il est donc nécessaire d’utiliser un drapeau booléen.

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

De plus, si vous prenez cette chaîne comme entrée utilisateur, vous devriez également vous demander si elle est réellement fractionnable avec de l'espace. S'il est possible que l'hypothèse se brise, un vérificateur de regex est préférable. Une expression rationnelle comme celle-ci extraira la valeur en virgule flottante et le préfixe de "b". Ensuite, vous pouvez convertir en toute sécurité les chaînes capturées en double.

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

Vous pouvez avoir une fonction utilitaire comme celle-ci

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());
}
82
Neel Basu

N'oubliez pas de vérifier si la conversion a réussi!

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
8
Mikhail

La chaîne que vous avez ici contient un nombre à virgule flottante avec une unité. Je recommanderais de scinder cette chaîne en un nombre et une partie d'unité avec QString::split().

Ensuite, utilisez toDouble() pour obtenir un nombre à virgule flottante et arrondissez à votre guise.

8
confusopoly

Utilisez .toInt() pour int .toFloat() pour float et .toDouble() pour double

toInt ();

3
Samuel Ives

Vous pouvez utiliser:

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

Sortie:

n = 10
1
Jaziri Rami

À titre de suggestion, vous pouvez également utiliser la fonction QChar::digitValue() pour obtenir la valeur numérique du chiffre. Par exemple:

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

Source: Conversion d'un élément d'un QString en int

1
Angie Quijano