将`double`转换为`string`

时间:2013-10-30 18:08:08

标签: c++ string double type-conversion

我正在实施这个:

double x;
ostringstream x_convert;
x_convert << x;
string x_str = x_convert.str();

这似乎有点多余。有更优雅的方式吗?

5 个答案:

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