How to convert a string to an int in C++? (Or to a float, double, etc)
Ok, so I already have a post on How to convert an int to a string in C++? (Also doubles, floats, etc…) and so I need a post on doing this in reverse.
So lets say you wanted to convert a string to an int. The code for a function would be simple: (Note updated to one that didn’t give errors on either windows or Linux)
int stringToInt( string inString ) { int retVal; stringstream ss; ss << inString; ss >> retVal; return retVal; }
Now, you are going to want a function that handles more than just int types. You want it to handle int, float, doubles, etc… So lets use a template for this as well. However, since the return type is never going to be known, we will not have a return type. Instead, we will pass in a reference to a variable and that will be a generic.
template <class T> void stringToAnyType(T& t, std::string inString) { std::stringstream ss(inString); ss >> t; }
At first it will appear that this code is all that is needed, and sure the code will work for int, float doubles, but not for 100% for char types because when converting to a char it only gets the first word. Here is a quick example of using the template code. Copy it over and run it with a debugger and look at the variable values.
Note: I am on Windows 7 64 bit (app compiled as 32 bit) using a Visual Studio 2008 C++ empty project. I wonder if the output is different on other platforms.
//#include <iostream> #include <string> #include <sstream> template <class T> void stringToAnyType(T& t, std::string inString) { std::stringstream ss(inString); ss >> t; } using namespace std; int main() { string intAsString = "12345"; int i; stringToAnyType(i, intAsString); string floatAsString1 = "12345.678"; float f1; stringToAnyType(f1, floatAsString1); // Looks like this works string floatAsString2 = "99.99"; float f2; stringToAnyType(f2, floatAsString2); // Hmmm...a little loss of precision: 99.989998 string doubleAsString1 = "123456789.12345678"; double d1; stringToAnyType(d1, doubleAsString1); // Perfect conversion string doubleAsString2 = "99.99"; double d2; stringToAnyType(d2, doubleAsString2); // Hmmm...a little loss of precision: 99.989999999999995 string charArrayAsString1 = "Hello"; char c1[100]; stringToAnyType(c1, charArrayAsString1); string charArrayAsString2 = "Hello world"; char c2[100]; stringToAnyType(c2, charArrayAsString2); // Ahhh! This didn't work. Only the first word "Hello" is copied into c2 string trueBoolAsString = "True"; bool bTrue; stringToAnyType(bTrue, trueBoolAsString); // Did this really work? string falseBoolAsString = "false"; bool bFalse; stringToAnyType(bFalse, falseBoolAsString); // Ahhh! This didn't work. It is still true not false; string yesBoolAsString = "Yes"; bool bYes; stringToAnyType(bTrue, yesBoolAsString); // Ahhh! This didn't work. It is still true not false; string noBoolAsString = "NO"; bool bNo; stringToAnyType(bFalse, noBoolAsString); // Ahhh! This didn't work. It is still true not false; }
So obviously there must be a better way that will also get bool conversions and to get the full string when converting a string to a char array, but for now this gets your basic number types and any string without characters such as a space. When I have a solution that works for char types as well, I will let you know.
Also, as you can see that there is a chance of a loss of precision with floats and doubles so be careful.