将double转换为字符串C++? [复制]

Posted

技术标签:

【中文标题】将double转换为字符串C++? [复制]【英文标题】:Convert double to string C++? [duplicate] 【发布时间】:2009-07-14 02:44:59 【问题描述】:

可能重复:How do I convert a double into a string in C++?

我想组合一个字符串和一个双精度,而 g++ 抛出这个错误:

main.cpp:在函数“int main()”中: main.cpp:40: 错误:“const char [2]”和“double”类型的无效操作数到二进制“operator+”

这是引发错误的代码行:

存储正确[count] = "("+c1+","+c2+")";

storedCorrect[] 是一个字符串数组,c1 和 c2 都是双精度数。有没有办法将 c1 和 c2 转换为字符串以使我的程序能够正确编译?

【问题讨论】:

下面的一些例子怎么样:codeproject.com/KB/recipes/Tokenizer.aspx 它们非常高效而且有点优雅。 ***.com/q/29200635/395461 【参考方案1】:

你不能直接做。有很多方法可以做到:

    使用std::stringstream

    std::ostringstream s;
    s << "(" << c1 << ", " << c2 << ")";
    storedCorrect[count] = s.str()
    

    使用boost::lexical_cast:

    storedCorrect[count] = "(" + boost::lexical_cast<std::string>(c1) + ", " + boost::lexical_cast<std::string>(c2) + ")";
    

    使用std::snprintf:

    char buffer[256];  // make sure this is big enough!!!
    snprintf(buffer, sizeof(buffer), "(%g, %g)", c1, c2);
    storedCorrect[count] = buffer;
    

还有许多其他方法,使用各种双字符串转换函数,但这些是您将看到它完成的主要方法。

【讨论】:

我知道这个答案很旧,但您可能还想在此处包含std::string to_string( double );【参考方案2】:

在 C++11 中,use std::to_string 如果您可以接受默认格式 (%f)。

storedCorrect[count]= "(" + std::to_string(c1) + ", " + std::to_string(c2) + ")";

【讨论】:

【参考方案3】:

使用std::stringstream。它的operator &lt;&lt; 被所有内置类型重载。

#include <sstream>    

std::stringstream s;
s << "(" << c1 << "," << c2 << ")";
storedCorrect[count] = s.str();

这与您期望的一样工作 - 与您使用 std::cout 打印到屏幕的方式相同。您只是“打印”到一个字符串。 operator &lt;&lt; 的内部负责确保有足够的空间并进行任何必要的转换(例如,doublestring)。

另外,如果您有可用的 Boost 库,您可以考虑查看lexical_cast。语法看起来很像普通的 C++ 风格的强制转换:

#include <string>
#include <boost/lexical_cast.hpp>
using namespace boost;

storedCorrect[count] = "(" + lexical_cast<std::string>(c1) +
                       "," + lexical_cast<std::string>(c2) + ")";

在底层,boost::lexical_cast 基本上与我们对std::stringstream 所做的事情相同。使用 Boost 库的一个关键优势是您可以同样轻松地使用其他方式(例如,stringdouble)。不用再搞乱atof()strtod() 和原始C 风格的字符串。

【讨论】:

实际上,boost::lexical_cast 并没有在后台使用std::stringstream。它实现了自己的转换例程,比使用stringstream 快得多,并且在大多数情况下比scanf/printf 快。见:boost.org/doc/libs/1_48_0/doc/html/boost_lexical_cast/… lexical_cast 的来源与我上次看到时大不相同。在过去的几个 Boost 版本中,它们似乎已经大大提高了性能。如果可以的话,这就是更多的理由。【参考方案4】:
std::string stringify(double x)
 
   std::ostringstream o;
   if (!(o << x))
     throw BadConversion("stringify(double)");
   return o.str();
 

C++ 常见问题解答: http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1

【讨论】:

【参考方案5】:

我相信 sprintf 是适合您的功能。我在标准库中,比如 printf。点击以下链接了解更多信息:

http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

【讨论】:

sprintf 对数字格式不安全,因为它不对输出缓冲区进行任何边界检查,并且没有好的可移植方法来确定对任何人都安全的缓冲区大小double 值。 在这种情况下,使用snprintf :) 但实际上,预测所需的缓冲区大小可能很困难。

以上是关于将double转换为字符串C++? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将 Double 转换为字符串

在 C++ 中将数字转换为字符串的最佳方法? [复制]

将double转换为字符串时,如何在C#中将其四舍五入到N个小数位? [复制]

C++将小数(double)转化为分数(Rational)

将双精度转换为字符数组 C++

在 C++ 中将变量名转换为字符串