1

我正在实施这个:

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

好像有点多余。有没有更优雅的方式?

4

5 回答 5

10

你在使用 C++11 吗?如果是这样,有:

auto x_str = std::to_string(x);
于 2013-10-30T18:09:28.183 回答
4

std::to_string

std::string x_str = std::to_string(x);
于 2013-10-30T18:09:08.917 回答
3

您拥有的是最安全的方法(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&)

于 2013-10-30T18:46:41.613 回答
2

如果没有 C++11,您可以编写自己的to_string函数:

string to_string(double x) {
  ostringstream x_convert;
  x_convert << x;
  return x_convert.str();
}
于 2013-10-30T18:37:38.287 回答
1

正如其他人所提到的,对于 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 中有类似的设备——如果可以的话,我会使用这些设备。

于 2013-10-30T18:14:20.910 回答