【问题标题】:Converting `double` to `string`将`double`转换为`string`
【发布时间】:2013-11-10 12:30:21
【问题描述】:

我正在实现这个:

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

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

【问题讨论】:

  • 不要标记这个问题[C]ostringstream.str();,仅是[C++],不是[C]
  • 您可以将整个内容包装在一个函数中,这样您就可以减少打字。正如每个人都指出的那样,C++11 为您做到了这一点,std::to_string()。问题是缺乏对字符串外观的控制。

标签: c++ string double type-conversion


【解决方案1】:

std::to_string

std::string x_str = std::to_string(x);

【讨论】:

    【解决方案2】:

    您使用的是 C++11 吗?如果是这样,有:

    auto x_str = std::to_string(x);
    

    【讨论】:

      【解决方案3】:

      对于 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】:

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

        string to_string(double x) {
          ostringstream x_convert;
          x_convert << x;
          return x_convert.str();
        }
        

        【讨论】:

          【解决方案5】:

          您拥有的是最安全的方法(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&amp; operator&lt;&lt;(std::ostream&amp;, T&amp;) 重载的任何类型。

          【讨论】:

          • 嗯,sprintf 的这种用法没有任何不“安全”的地方;它会工作得很好。
          • @PeteBecker 因为在这种情况下,我分配了一个比浮点精度大得多的缓冲区,所以你是对的。比如我把buffer的大小改成10,就不是这样了。
          • 是的,如果代码不同,结果可能会不同。但事实并非如此,而且“不安全”的说法是错误的。
          • 去掉括号即可。无需在sprintf 上廉价拍摄。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-02
          • 1970-01-01
          • 2012-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多