如何将QString转换为int?

81

我在我的源代码中有一个QString,所以我需要将它转换为整数去掉 "Kb"。

我尝试了Abcd.toInt(),但它不起作用。

QString Abcd = "123.5 Kb"

2
sscanf("123.5 Kb", "%f %s", &f,&s); - Grijesh Chauhan
2
QString Abcd = "123.5 Kb"; float f; QString s; sscanf(Abcd.toUtf8().constData(), "%f %s", &f, s.toUtf8().data()); 错误:无法将“QString”转换为“const char”,用于参数“1”的“int sscanf(const char,const char*,...)” - user2398614
3
123.5不是整数(即使没有Kb)-你确定你想要那个吗? - Tobias Langner
7个回答

105

您的字符串中缺少数字字符。因此,您需要按空格拆分

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

更新:我正在更新一个旧的答案。那是对特定问题的简单回答,有一个严格的假设。然而,如@DomTomCat在评论中和@Mikhail在答案中指出的那样,一般来说,我们应该始终检查操作是否成功。因此使用布尔标志是必要的。

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

如果您将该字符串作为用户输入,请考虑该字符串是否确实可以使用空格分隔,同时应持怀疑态度。如果有可能假设会被打破,则更建议使用正则表达式验证器。像下面这样的正则表达式将提取浮点值和' b '前缀字符。然后,您可以安全地将捕获的字符串转换为双精度。

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

你可以使用下面的实用函数

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

尽管此答案适用于提问者的特定示例,但我错过了@Mikhail答案的成功测试,该测试应始终进行检查。 - DomTomCat
是的,没错。这只是一行代码。但是,我们应该始终验证此类操作。 - Neel Basu

14

不要忘记检查转换是否成功!

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

11

你这里的字符串包含一个带有单位的浮点数。我建议使用 QString::split() 方法将该字符串分成数字部分和单位部分。

然后使用 toDouble() 方法获取浮点数并按照需要进行四舍五入。


9

您可以使用:

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

输出:

n = 10

3
与大多数答案提出的相同,对我来说这是一个多余的回答。 - eyllanesc
@eyllanesc我不能说你错了,但同时这个答案非常简单直接,回答了标题中提出的一般性问题,而没有专注于正文中提出的具体问题(这需要舍弃一部分字符串)。我给你点赞。 - undefined

5
使用 .toInt() 转换为整型,使用 .toFloat() 转换为浮点型,使用 .toDouble() 转换为双精度浮点型。详见toInt();

1
作为建议,您还可以使用QChar::digitValue()来获取数字的数值。例如:
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
    }
}

来源: 将QString中的一个元素转换为int


-2
关于注释:
sscanf(Abcd, "%f %s", &f,&s);

出现错误。

这是正确的方法:

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

5
OP 询问关于 Qt,而 sscanf 不是 Qt。 - Mr. Developerdude
无论sscanf是否是Qt的方式,这都太丑陋了!qPrintable返回字符串的当前大小的数组。如果“Abcd”中的字符串部分比其当前值长-缓冲区溢出,则操作未定义。此处有风险。 - Steve Folly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接