std :: string和format string

时间:2009-10-15 23:39:36

标签: c++ string-formatting

我通过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;
} 

4 个答案:

答案 0 :(得分:2)

如果C语言不能做,C ++就不会成功。

您需要查看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)等等。从技术上讲,这不会很好地扩展,但它可能是非常罕见的,你根本不需要它。