C ++:将double转换为字符串的最佳方法是什么?

时间:2009-08-21 20:11:20

标签: c++ c

实现与此相同的最佳方法是什么?

void foo(double floatValue, char* stringResult)
{
    sprintf(stringResult, "%f", floatValue);
}

12 个答案:

答案 0 :(得分:23)

我敢肯定有人会说boost :: lexical_cast,所以如果你使用的是boost,那就去吧,但它基本上与此相同:

 #include <sstream>
 #include <string>

 std::string doubleToString(double d)
 {
    std::ostringstream ss;
    ss << d;
    return ss.str();
 }

请注意,您可以轻松地将其转换为适用于可以插入流的任何内容的模板(不仅仅是双精度数据)。

答案 1 :(得分:10)

http://www.cplusplus.com/reference/iostream/stringstream/

double d=123.456;
stringstream s;
s << d; // insert d into s

答案 2 :(得分:4)

升压:: lexical_cast&LT;&GT;

答案 3 :(得分:4)

在dinkumware STL上,字符串流由C库snprintf填写。

因此,直接使用snprintf格式将与STL格式化部分相比。 但有人曾告诉我,整体大于或等于其已知部分的总和。

因为关于stringstream是否会进行分配(并且我很确定DINKUMWARE不会在stringstream中包含一个小缓冲区来转换像你这样的单个项目),因此它将取决于平台,所以任何需要的东西都是值得怀疑的。分配(特别是如果MULTITHREADED)可以与snprintf竞争。

实际上(格式化+分配)有可能真的很糟糕,因为在多线程环境中分配和释放可能需要2个完整的读 - 修改 - 写周期,除非分配实现有一个线程本地小堆。 / p>

话虽如此,如果我真的关心性能,我会接受上面其他一些评论的建议,更改界面以包含大小并使用snprintf - 即。

bool 
foo(const double d, char* const p, const size_t n){
     use snprintf......
     determine if it fit, etc etc etc.
}

如果你想要一个std :: string你最好还是使用上面的东西并从结果char *中实例化字符串,因为std :: stringstream,std :: string解决方案将涉及2个分配+2个版本

BTW我无法判断问题中的“字符串”是std :: string还是只是泛型ascii字符“string”的用法

答案 4 :(得分:3)

最好的办法是构建一个简单的模板化函数,将任何可流传输的类型转换为字符串。这是我的方式:

#include <sstream>
#include <string>

template <typename T>
const std::string to_string(const T& data)
{
   std::ostringstream conv;
   conv << data;
   return conv.str();
}

如果你想要一个const char *表示,只需在上面替换conv.str()。c_str()。

答案 5 :(得分:2)

我认为sprintf几乎是最佳方式。您可能更喜欢snprintf,但它与性能无关。

答案 6 :(得分:2)

我可能会按照你在问题中的建议去做,因为没有内置的ftoa()函数,sprintf让你可以控制格式。谷歌搜索“ftoa asm”会产生一些可能有用的结果,但我不确定你是否想要走那么远。

答案 7 :(得分:1)

如果你使用Qt4框架工作,你可以去:

double d = 5.5;
QString num = QString::number(d);

答案 8 :(得分:1)

Herb Sutter已经对将int转换为字符串的替代方法进行了广泛的研究,但我认为他的论点也适用于双重。

他着眼于模板中安全性,效率,代码清晰度和可用性之间的平衡。

在此处阅读:http://www.gotw.ca/publications/mill19.htm

答案 9 :(得分:0)

_gcvt_gcvt_s

答案 10 :(得分:0)

这是非常有用的线程。我使用sprintf_s但我开始怀疑它是否真的比其他方式更快。我在Boost网站上看​​到了以下文档,其中显示了Printf / scanf,StringStream和Boost之间的性能比较。

Double to String是我们在代码中进行的最常见的转换,因此我会坚持使用我所使用的内容。但是,在其他情况下使用Boost可能是您的决定性因素。

http://www.boost.org/doc/libs/1_58_0/doc/html/boost_lexical_cast/performance.html

答案 11 :(得分:0)

将来,您可以使用std::to_chars来编写类似https://godbolt.org/z/cEO4Sd的代码。不幸的是,只有VS2017和VS2019支持此功能的一部分...

#include <iostream>
#include <charconv>
#include <system_error>
#include <string_view>
#include <array>

int main()
{
    std::array<char, 10> chars;
    auto [parsed, error] = std::to_chars(
        chars.data(), 
        chars.data() + chars.size(), 
        static_cast<double>(12345.234)
    );
    std::cout << std::string_view(chars.data(), parsed - chars.data());
}

有关MSVC详细信息的冗长讨论,请参阅 https://www.reddit.com/r/cpp/comments/a2mpaj/how_to_use_the_newest_c_string_conversion/eazo82q/