I am trying to convert treePtr->item.getInvest()
which contains a string to an integer. Is this possible?
views:
302answers:
3
+6
A:
#include <sstream>
// ...
string str(*(treePtr->item.getInvest())); // assuming getInvest() returns ptr
istringstream ss(str);
int the_number;
ss >> the_number;
wilhelmtell
2009-10-31 23:43:38
Yes that worked, Thank you very much
D-Boy
2009-11-01 00:49:41
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
2009-11-01 02:57:50
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.
alex tingle
2009-11-01 11:37:49
+2
A:
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).
alex tingle
2009-11-01 00:26:59
Streams are "the C++ way." I prefer it to worrying about getting all the details associated with C strings right.
mch
2009-11-01 00:35:23
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.
alex tingle
2009-11-01 02:54:48
+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
m-sharp
2009-11-01 04:10:19
but it is sometimes best to get amature developers to use strings and functions that avoid seg faults from incorrect array sizes and access when using char*'s.I find that char* issues are a large percentage of the bugs in peoples code unless they are good, careful programmers
Fuzz
2009-11-01 04:17:07
@alex tingle streams do have error states, and stringstreams use them when a parse fails.
wilhelmtell
2009-11-01 04:31:45
+4
A:
if you have access to boost:
int number= boost::lexical_cast<int>(treePtr->item.getInvest());
Edison Gustavo Muenz
2009-11-01 03:35:29