【问题标题】:C++ getting some float values into a stringC ++将一些浮点值转换为字符串
【发布时间】:2015-01-24 13:39:52
【问题描述】:

我完全不知道该怎么做;我有一点数据(例如f24.57e62.74d41.0)。我想做的是3个功能:

  1. 我取 f (=24.57) 的值并返回
  2. 我取 e (=62.74) 的值并返回
  3. 我取 d (=41.0) 的值并返回

我不知道该怎么做。我尝试使用 boost::split 但如果我用 f 拆分,我会得到24.57e62.74d41.0... 事实上,f、e 和 d 每次都会在这里处理任何情况。那么,您认为我可以通过拆分(或其他)获得 f、e 和 d 的位置,然后从那里获得值吗? 我不知道这是否可以理解。所以分两点:

  1. 我将收到一个带有 f、e 和 d 的值,它位于浮点值旁边。
  2. 我想从中获取浮点值。 提前感谢您。

编辑:代码:

std::string m_specif = "f24.57e62.74d41.0";
std::vector<std::string> fields;
boost::split(fields, m_specif, boost::is_any_of("f")); // Will get 24.57e62.74d41.0 at fields[1]
std::cout << fields[1]

【问题讨论】:

  • 我试图在 f 的右侧捕获 te 值(我得到 24.57e62.74d41.0)。代码是:std::string m_specif = f24.57e62.74d41.0 std::vector&lt;std::string&gt; fields; boost::split(fields, m_specif, boost::is_any_of("f")); // Will get 24.57e62.74d41.0 at fields[1] std::cout &lt;&lt; fields[1] 代码在问题帖中,这里不可读。
  • Os如果你把它改成“fed”而不是“f”,是不是不行?

标签: c++ string split


【解决方案1】:

只需使用atof():

std::string data("f24.57e62.74d41.0");
std::vector<std::string> values;
boost::split(values, data, boost::is_any_of("fed"));

double fValue = strtod(values[0].c_str(), NULL);
double eValue = strtod(values[1].c_str(), NULL);
double dValue = strtod(values[2].c_str(), NULL);

编辑时:或者,正如@basav 所说,您可以使用atof()

【讨论】:

  • 选择这个解决方案,Avinash Raj 很有趣,但我需要在使用它之前了解更多关于正则表达式的信息。谢谢大家。
【解决方案2】:

使用捕获组或积极的后视。

"(?<=[edf])\\d+(?:\\.\\d+)?"

从组索引 0 中获取你想要的数字。

"[edf](\\d+(?:\\.\\d+)?)"

从组索引 1 中获取您想要的数字。

DEMO

【讨论】:

    【解决方案3】:

    1) 求两点的位置,这里是 f & e

       int pos1= string.find('f')
      int pos2= string.find('e')
    

    2) 然后使用 substr() 将这些位置之间的字符相应地拉到一个新字符串中。

    newstring=string.substr(pos1+1,pos2-1);
    

    如果之后需要将其转换为浮点数,可以使用:

    double temp = ::atof(newstring.c_str());
    

    【讨论】:

      【解决方案4】:

      我们可以做一个正常的循环:

      std::string data("f24.57e62.74d41.0");
      size_t it = data.find_first_of("def");
      while (it != std::string::npos) {
          size_t next = data.find_first_of("def", it + 1);
          std::cout << "The value of " << data[it] << " is " << 
              std::stof(data.substr(it + 1, next - it - 1)) << std::endl;
          it = next;
      }
      

      或者,我们可以尝试使用istringstream:

      std::string data("f24.57e62.74d41.0");
      std::istringstream iss(data);
      
      char c;
      double d;
      while (iss >> c >> d) {
          std::cout << "value of " << c << " is " << d << std::endl;
      }
      

      如果不是因为 'e' 被视为科学记数法,至少这会工作并且干净整洁,因此第一个解析出来的双精度是 24.57e62。因此,如果您可以将e 更改为不是e 的任何其他字母,那么这是一个选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-27
        相关资源
        最近更新 更多