C ++将一些浮点值转换为字符串
C++ getting some float values into a string
我完全不知道该怎么做;我有一些数据(例如f24.57e62.74d41.0
)。我想做的是 3 个功能:
- 我取f的值(=24.57)和return它
- 我取e的值(=62.74)和return它
- 我取d的值(=41.0)和return它
我不知道该怎么做。我尝试使用 boost::split 但如果我与 f 分开,我会得到 24.57e62.74d41.0
...
事实上,f、e 和 d 每次都会在这里处理任何案件。那么,您认为我可以通过拆分(或其他)获得 f、e 和 d 的位置,然后从那里获得值吗?
我不知道这是否可以理解。所以有两点:
- 我将收到一个带有 f、e 和 d 的值,它位于浮点值旁边。
- 我想从中获取浮点值。
提前谢谢你。
编辑:代码:
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]
使用捕获组或正向后视。
"(?<=[edf])\d+(?:\.\d+)?"
从组索引 0 中获取您想要的号码。
"[edf](\d+(?:\.\d+)?)"
从组索引 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()
1)求两点的位置,这里是f & e
int pos1= string.find('f')
int pos2= string.find('e')
2) 然后使用 substr() 将这些位置之间的字符相应地提取到一个新字符串中。
newstring=string.substr(pos1+1,pos2-1);
如果以后需要转为float,可以使用:
double temp = ::atof(newstring.c_str());
我们可以做一个正常的循环:
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'
的话,它至少会工作并且很好而且干净,为此目的,它被视为科学记数法,因此解析出的第一个 double 是 24.57e62
。因此,如果您可以将 e
更改为任何其他不是 e
的字母,那么这是一个选项。
我完全不知道该怎么做;我有一些数据(例如f24.57e62.74d41.0
)。我想做的是 3 个功能:
- 我取f的值(=24.57)和return它
- 我取e的值(=62.74)和return它
- 我取d的值(=41.0)和return它
我不知道该怎么做。我尝试使用 boost::split 但如果我与 f 分开,我会得到 24.57e62.74d41.0
...
事实上,f、e 和 d 每次都会在这里处理任何案件。那么,您认为我可以通过拆分(或其他)获得 f、e 和 d 的位置,然后从那里获得值吗?
我不知道这是否可以理解。所以有两点:
- 我将收到一个带有 f、e 和 d 的值,它位于浮点值旁边。
- 我想从中获取浮点值。 提前谢谢你。
编辑:代码:
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]
使用捕获组或正向后视。
"(?<=[edf])\d+(?:\.\d+)?"
从组索引 0 中获取您想要的号码。
"[edf](\d+(?:\.\d+)?)"
从组索引 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()
1)求两点的位置,这里是f & e
int pos1= string.find('f')
int pos2= string.find('e')
2) 然后使用 substr() 将这些位置之间的字符相应地提取到一个新字符串中。
newstring=string.substr(pos1+1,pos2-1);
如果以后需要转为float,可以使用:
double temp = ::atof(newstring.c_str());
我们可以做一个正常的循环:
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'
的话,它至少会工作并且很好而且干净,为此目的,它被视为科学记数法,因此解析出的第一个 double 是 24.57e62
。因此,如果您可以将 e
更改为任何其他不是 e
的字母,那么这是一个选项。