c ++ integer-> std :: string转换。功能简单吗?


76

问题:我有一个整数;该整数需要转换为stl :: string类型。

过去,我曾经stringstream做过一次转换,这有点麻烦。我知道C方法是执行sprintf,但是我宁愿使用类型安全的C ++方法。

有一个更好的方法吗?

这是我过去使用过的stringstream方法:

std::string intToString(int i)
{
    std::stringstream ss;
    std::string s;
    ss << i;
    s = ss.str();

    return s;
}

当然,可以这样重写:

template<class T>
std::string t_to_string(T i)
{
    std::stringstream ss;
    std::string s;
    ss << i;
    s = ss.str();

    return s;
}

但是,我有一个想法,那就是这是一个“重量级”的实现。

Zan指出,该调用非常不错,但是:

std::string s = t_to_string(my_integer);

无论如何,一种更好的方法将是……好。

有关:

替代itoa()将整数转换为字符串C ++?


在您的示例t_to_string中,我看不到为什么需要模板规范。模板函数可以根据其参数类型确定其模板类型。
Zan Lynx 2010年

@赞:杜普。这就是我发布未编译的代码所得到的。
保罗·内森

13
下面的一些示例如何处理:codeproject.com/KB/recipes/Tokenizer.aspx 它们非常有效并且有些优雅。

@Beh:该库比简单的t_to_string()重很多。它实际上看起来像一个非常不错的库,但是我不想仅通过执行t_to_string()来导入整个内容。
保罗·内森

Answers:



28

就像前面提到的,我建议提升lexical_cast。它不仅具有相当不错的语法:

#include <boost/lexical_cast.hpp>
std::string s = boost::lexical_cast<std::string>(i);

它还提供了一些安全性:

try{
  std::string s = boost::lexical_cast<std::string>(i);
}catch(boost::bad_lexical_cast &){
 ...
}

22

不完全是,在标准中。某些实现具有非标准的itoa()函数,您可以查找Boost的lexical_cast,但是如果坚持使用该标准,则可以在stringstream和sprintf()之间(如果有的话,可以在snprintf()之间进行选择)。


2
好消息,此问题已得到解决,请参阅Schaub的回答
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.