I am trying to convert treePtr->item.getInvest() which contains a string to an integer. Is this possible?
3 Answers
#include <sstream>
// ...
string str(*(treePtr->item.getInvest())); // assuming getInvest() returns ptr
istringstream ss(str);
int the_number;
ss >> the_number;
2 Comments
alex tingle
It works, but it is inefficient - there's at least one heap allocation and free there, which may well get stuck in a mutex if your program in multi-threaded. Are you doing this once, or millions of times?
alex tingle
wilhelmtell: Just because we are writing C++ does not mean that everything has to be a class. Premature optimisation may be the root of all evil, but wilfully choosing to do extra work is perverse.
Better to use strtol() than mess around with streams.
const char* s = treePtr->item.getInvest();
const char* pos;
long the_number = ::strtol(s,&pos,10);
if(pos!=s)
// the_number is valid
strtol() is a better choice because it gives you an indication of whether number returned is valid or not. Furthermore it avoids allocating on the heap, so it will perform better. If you just want a number, and you are happy to accept a zero instead of an error, then just use atol() (which is just a thin wrapper around strtol that returns zero on error).
7 Comments
Drew Dormann
"Better to use strtol" ... why?
mch
Streams are "the C++ way." I prefer it to worrying about getting all the details associated with C strings right.
alex tingle
Shmoopty: fair question. I have added my reasoning to the answer.
alex tingle
mch: Streams certainly have their place, but a straight replacement for
strtol() is not one of them. Just as you would not use a std::string when a const char* would suffice.m-sharp
+1 for this answer. streams have their place but are very inefficient. you could do a template specialization for boost::lexical_cast<int> that uses strtol
|