【问题标题】:How to convert QString to int?如何将 QString 转换为 int?
【发布时间】:2013-05-14 01:38:58
【问题描述】:

我的来源中有QString。 所以我需要将它转换为整数没有“Kb”。

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

QString Abcd = "123.5 Kb"

【问题讨论】:

  • sscanf("123.5 Kb", "%f %s", &f,&s);
  • QString Abcd = "123.5 Kb";浮动 f; QString s; sscanf(Abcd, "%f %s", &f,&s);错误:无法将参数“1”的“QString”转换为“const char*”到“int sscanf(const char*, const char*, ...)”
  • 123.5 不是整数(即使没有 Kb) - 你确定要这样吗?

标签: c++ string qt int qstring


【解决方案1】:

您的字符串中没有所有数字字符。所以你必须按空间分割

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

更新:我正在更新旧答案。这是对特定问题的直接回答,并带有严格的假设。但是,正如 cmets 中的 @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 的答案的成功测试,应该经常检查。
  • 是的。这是正确的。这是一个单线。但是是的,应该始终验证此类操作
【解决方案2】:

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

然后使用toDouble()得到一个浮点数,并根据需要进行四舍五入。

【讨论】:

    【解决方案3】:

    别忘了检查转换是否成功!

    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
    

    【讨论】:

      【解决方案4】:

      你可以使用:

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

      输出:

      n = 10
      

      【讨论】:

      • 与大多数答案建议的相同,对我来说这是一个多余的响应。
      【解决方案5】:

      .toInt() 用于int,.toFloat() 用于float,.toDouble() 用于double

      toInt();

      【讨论】:

        【解决方案6】:

        作为建议,您也可以使用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
            }
        }
        

        来源:Converting one element from a QString to int

        【讨论】:

          【解决方案7】:

          在 cmets 上:

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

          给出一个错误。

          这是正确的方法:

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

          【讨论】:

          • OP 询问的是 Qt,而 sscanf 不是 Qt
          • 不管 sscanf 是否是 Qt 方式,这都太可怕了! qPrintable 返回字符串的 current 大小的数组。如果Abcd 中的字符串部分长于其当前值,则操作未定义 - 缓冲区溢出。这里是龙。
          猜你喜欢
          • 2011-03-13
          • 1970-01-01
          • 2012-12-19
          • 1970-01-01
          • 1970-01-01
          • 2015-01-17
          • 2021-11-17
          • 2020-04-20
          • 2012-11-04
          相关资源
          最近更新 更多