我正在实施这个:
double x;
ostringstream x_convert;
x_convert << x;
string x_str = x_convert.str();
这似乎有点多余。有更优雅的方式吗?
答案 0 :(得分:9)
您使用的是C ++ 11吗?如果是这样,那就是:
auto x_str = std::to_string(x);
答案 1 :(得分:3)
<强> std::to_string
强>:
std::string x_str = std::to_string(x);
答案 2 :(得分:2)
你拥有的是最安全的方法(pre-C ++ 11)。
或者,您可以这样:
double value = SOME_VALUE;
char buffer[100] = {};
sprintf(buffer, "%f", value);
std::string s = buffer;
这在功能上与std::to_string
的功能相同。你必须小心为buffer
分配足够的空间,并且(正如你所看到的),你仍然在编写大约4行代码来进行这种转换,因此它不再优于(或者更少)优雅其他方法。
如果您遇到C ++ 11之前的版本,可以通过执行以下操作来实现自己的to_string
:
template<typename T>
std::string to_string(T t)
{
std::ostringstream oss;
oss << t;
return oss.str();
}
哪种类型适用于已经过载std::ostream& operator<<(std::ostream&, T&)
的任何类型。
答案 3 :(得分:0)
使用C ++ 11,如其他人所述,使用std::to_string
。
如果没有C ++ 11,你就会被你已经编写过的代码所困扰,或者是这些代码。您可以通过构建一个为您构建字符串的设备,使该代码的使用更加优雅(阅读:减少输入):
class StringBuilder
{
public:
template <typename T> inline StringBuilder& operator<<(const T& t)
{
mStream << t;
return * this;
}
inline std::string get() const
{
return mStream.str();
}
inline operator std::string () const
{
return get();
}
private:
std::stringstream mStream;
};
现在你可以:
double x;
string x_str = StringBuilder() << x;
但是在一天结束时,对于同样的事情,它实际上只是语法糖。 Boost中有类似的设备 - 如果可以,我会使用它们。
答案 4 :(得分:0)
如果没有C ++ 11,您可以编写自己的to_string
函数:
string to_string(double x) {
ostringstream x_convert;
x_convert << x;
return x_convert.str();
}