我通过Google找到了以下代码。它几乎完成了我想要它做的事情,除了它没有提供一种方法来表示像C语言格式字符串中'%。* f'那样的精度。此外,它不提供超过5位小数的任何内容。我是否必须坚持使用C字符串和snprintf?
#include <string>
#include <sstream>
#include <iostream>
template <class T>
std::string to_string(T t, std::ios_base & (*f)(std::ios_base&))
{
std::ostringstream oss;
oss << f << t;
return oss.str();
}
int main()
{
std::cout<<to_string<double>(3.1415926535897931, std::dec)<<std::endl;
return 0;
}
答案 0 :(得分:2)
您需要查看manipulators。
如果你想要C风格的格式(我更喜欢它,它更简洁),请查看Boost.Format。
答案 1 :(得分:2)
您想使用std::setprecision
操纵器:
int main()
{
std::cout << std::setprecision(9) << to_string<long>(3.1415926535897931, std::dec)
<< '\n';
return 0;
}
答案 2 :(得分:1)
你看过Boost::format吗?
编辑:你想要的并不完全清楚。如果您只想写入带有格式的字符串,则可以在字符串流上使用普通操纵器。如果你想使用printf风格的格式化字符串,但保留类型安全性,Boost :: format可以/将会这样做。
答案 3 :(得分:1)
采用几乎正确的答案(请注意,在这种简单的情况下std :: dec是多余的):
int main()
{
std::cout << std::setprecision(9) << std::dec << 3.1415926535897931 << std::endl;
return 0;
}
但是,如果你想让to_string函数按照需要运行,那就更难了。您需要将setprecision(9)
传递给to_string<T>
函数,并且它不接受该类型的参数。你想要一个模板化的版本:
template <class T, class F>
std::string to_string(T t, F f)
{
std::ostringstream oss;
oss << f << t;
return oss.str();
}
int main()
{
std::cout << to_string<double>(3.1415926535897931, std::setprecision(9)) << std::endl;
return 0;
}
这是有效的,因为你真的不需要在to_string中使用std :: dec。但是如果你需要传递更多的操纵器,那么简单的解决方案就是添加template <class T, class F1, class F2> std::string to_string(T t, F1 f1, F2 f2)
等等。从技术上讲,这不会很好地扩展,但它可能是非常罕见的,你根本不需要它。