77

Problem: I have an integer; this integer needs to be converted to a stl::string type.

In the past, I've used stringstream to do a conversion, and that's just kind of cumbersome. I know the C way is to do a sprintf, but I'd much rather do a C++ method that is typesafe(er).

Is there a better way to do this?

Here is the stringstream approach I have used in the past:

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

Of course, this could be rewritten as so:

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

However, I have the notion that this is a fairly 'heavy-weight' implementation.

Zan noted that the invocation is pretty nice, however:

std::string s = t_to_string(my_integer); 

At any rate, a nicer way would be... nice.

Related:

Alternative to itoa() for converting integer to string C++?

4
  • In your example t_to_string I fail to see why a template specification is required. A template function can determine its template type from its argument types. Commented Jul 28, 2010 at 22:06
  • @Zan: Durp. That's what I get for posting code I didn't compile. Commented Jul 28, 2010 at 22:13
  • 13
    How about some of the examples from the following: codeproject.com/KB/recipes/Tokenizer.aspx They are very efficient and somewhat elegant. Commented Nov 2, 2010 at 5:01
  • @Beh: That library is considerably heavier-weight than a simple t_to_string(). It actually looks like a very nice library, but I wouldn't want to import the whole thing for just doing a t_to_string(). Commented Nov 8, 2010 at 17:38

3 Answers 3

138

Now in c++11 we have

#include <string> string s = std::to_string(123); 

Link to reference: http://en.cppreference.com/w/cpp/string/basic_string/to_string

Sign up to request clarification or add additional context in comments.

3 Comments

Very spiffy. Have a link to the standard's page describing the function?
compiler errors for me -- "std::to_string: ambiguous call to overloaded function"
I would rephrase that to "Finally, we have ...".
28

Like mentioned earlier, I'd recommend boost lexical_cast. Not only does it have a fairly nice syntax:

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

it also provides some safety:

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

Comments

22

Not really, in the standard. Some implementations have a nonstandard itoa() function, and you could look up Boost's lexical_cast, but if you stick to the standard it's pretty much a choice between stringstream and sprintf() (snprintf() if you've got it).

1 Comment

Good thing this has been fixed, see Schaub's answer

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.