实现与此相同的最佳方法是什么?
void foo(double floatValue, char* stringResult)
{
sprintf(stringResult, "%f", floatValue);
}
答案 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转换为字符串的替代方法进行了广泛的研究,但我认为他的论点也适用于双重。
他着眼于模板中安全性,效率,代码清晰度和可用性之间的平衡。
答案 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/