1

I am trying to convert treePtr->item.getInvest() which contains a string to an integer. Is this possible?

1

3 Answers 3

8

if you have access to boost:

int number= boost::lexical_cast<int>(treePtr->item.getInvest());
Sign up to request clarification or add additional context in comments.

Comments

6
#include <sstream>

// ...

string str(*(treePtr->item.getInvest())); // assuming getInvest() returns ptr
istringstream ss(str);
int the_number;
ss >> the_number;

2 Comments

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?
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.
4

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

"Better to use strtol" ... why?
Streams are "the C++ way." I prefer it to worrying about getting all the details associated with C strings right.
Shmoopty: fair question. I have added my reasoning to the answer.
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.
+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
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.