467,116 Members | 1,135 Online
Bytes | Developer Community
Ask Question

Home New Posts Topics Members FAQ

Post your question to a community of 467,116 developers. It's quick & easy.

Is this code to find an int in a string okay ?

Hi Guys,

Is there any better way than below to find an int in a string (e.g.
"30" in "KFStat30A")

// --------------------------------------------------------------
#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

int main()
{
vector<string strs ;
strs.push_back("KFStat30A");
strs.push_back("KFStat2A");
strs.push_back("555555");
strs.push_back("KKKKKK");
strs.push_back("KKKK555");

std::string str;

for (int i=0; i<strs.size(); i++)
{
str = "";

int beg = strs[i].find_first_of("0123456789");

if (beg != string::npos)
{
int end = strs[i].find_first_not_of("0123456789", beg);
str.assign(strs[i], beg, end-beg);
}

cout << strs[i] << " " << str << "\n";
}
return 0;
}

// --------------------------------------------------------------

Thanks
-- Diwa
Dec 6 '07 #1
  • viewed: 2460
Share:
8 Replies
"Diwa" <sh***********@gmail.comwrote in message
news:85**********************************@j44g2000 hsj.googlegroups.com...
Hi Guys,

Is there any better way than below to find an int in a string (e.g.
"30" in "KFStat30A")

// --------------------------------------------------------------
#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

int main()
{
vector<string strs ;
strs.push_back("KFStat30A");
strs.push_back("KFStat2A");
strs.push_back("555555");
strs.push_back("KKKKKK");
strs.push_back("KKKK555");

std::string str;

for (int i=0; i<strs.size(); i++)
{
str = "";

int beg = strs[i].find_first_of("0123456789");

if (beg != string::npos)
{
int end = strs[i].find_first_not_of("0123456789", beg);
str.assign(strs[i], beg, end-beg);
}

cout << strs[i] << " " << str << "\n";
}
return 0;
}
This code looks okay. Although I wonder what you would want with a string
such as
"KFStat30A02". Your code could be described as finding the first continuous
number in a string. I really don't think you can simply if too much though
from what you already have, other than making it a function returning a
std::string.
Dec 6 '07 #2
Jim Langston wrote:
"Diwa" <sh***********@gmail.comwrote in message
news:85**********************************@j44g2000 hsj.googlegroups.com...
>Hi Guys,

Is there any better way than below to find an int in a string (e.g.
"30" in "KFStat30A")

// --------------------------------------------------------------
#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

int main()
{
vector<string strs ;
strs.push_back("KFStat30A");
strs.push_back("KFStat2A");
strs.push_back("555555");
strs.push_back("KKKKKK");
strs.push_back("KKKK555");

std::string str;

for (int i=0; i<strs.size(); i++)
{
str = "";

int beg = strs[i].find_first_of("0123456789");

if (beg != string::npos)
{
int end = strs[i].find_first_not_of("0123456789", beg);
str.assign(strs[i], beg, end-beg);
}

cout << strs[i] << " " << str << "\n";
}
return 0;
}

This code looks okay. Although I wonder what you would want with a
string such as
"KFStat30A02". Your code could be described as finding the first
continuous number in a string. I really don't think you can simply
if too much though from what you already have, other than making it a
function returning a std::string.
I would probably add the ability to extract the substring as a number
in a given base. E.g., "KFStat30A02" in base 10 would yield "30" and
in base 16 would yield "F"... :-) Or make it smarter and able to
recognize the 'x' or 'X' after the leading 0...

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Dec 6 '07 #3
In article
<85**********************************@j44g2000hsj. googlegroups.com>,
Diwa <sh***********@gmail.comwrote:
Hi Guys,

Is there any better way than below to find an int in a string (e.g.
"30" in "KFStat30A")

// --------------------------------------------------------------
#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

int main()
{
vector<string strs ;
strs.push_back("KFStat30A");
strs.push_back("KFStat2A");
strs.push_back("555555");
strs.push_back("KKKKKK");
strs.push_back("KKKK555");

std::string str;

for (int i=0; i<strs.size(); i++)
{
str = "";

int beg = strs[i].find_first_of("0123456789");

if (beg != string::npos)
{
int end = strs[i].find_first_not_of("0123456789", beg);
str.assign(strs[i], beg, end-beg);
}

cout << strs[i] << " " << str << "\n";
}
return 0;
}

// --------------------------------------------------------------

Thanks
What you have is fine, just wrap it into a function and it will look
like this:

string get_int( const string& s )
{
string result;
string::size_type front = s.find_first_of( "0123456789" );
if ( front != string::npos )
{
string::size_type back =
s.find_first_not_of( "0123456789", front );
result.assign( s, front, back - front );
}
return result;
}

.... or you can get creative:

bool is_digit( char c )
{
return isdigit( c );
}

string get_int( const string& s )
{
string::const_iterator front = find_if( s.begin(), s.end(),
&is_digit );
string::const_iterator back = find_if( front, s.end(),
compose1( logical_not<bool>(), ptr_fun( &is_digit ) ) );
return string( front, back );
}

(note: compose1 is part of STL, not part of the standard.)

Once you have the above function, you can operate on your array with
transform.

int main()
{
vector<string strs ;
strs.push_back("KFStat30A");
strs.push_back("KFStat2A");
strs.push_back("555555");
strs.push_back("KKKKKK");
strs.push_back("KKKK555");

vector<stringints;

transform( strs.begin(), strs.end(),
back_inserter( ints ), &get_int );

for ( int i = 0; i < strs.size(); ++i )
cout << strs[i] << ' ' << ints[i] << '\n';
}
Dec 7 '07 #4
On Dec 6, 3:51 pm, Diwa <shettydiwa...@gmail.comwrote:
Is there any better way than below to find an int in a string
(e.g. "30" in "KFStat30A")
boost::regex.

If for some reason, you can't use Boost (most people probably
can't), then beg, borrow or steal some other regular expression
class. You don't want to do anything with text without one.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Dec 7 '07 #5
On Dec 6, 5:31 pm, "Jim Langston" <tazmas...@rocketmail.comwrote:
"Diwa" <shettydiwa...@gmail.comwrote in message

news:85**********************************@j44g2000 hsj.googlegroups.com...
Hi Guys,
Is there any better way than below to find an int in a string (e.g.
"30" in "KFStat30A")
// --------------------------------------------------------------
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main()
{
vector<string strs ;
strs.push_back("KFStat30A");
strs.push_back("KFStat2A");
strs.push_back("555555");
strs.push_back("KKKKKK");
strs.push_back("KKKK555");
std::string str;
for (int i=0; i<strs.size(); i++)
{
str = "";
int beg = strs[i].find_first_of("0123456789");
if (beg != string::npos)
{
int end = strs[i].find_first_not_of("0123456789", beg);
str.assign(strs[i], beg, end-beg);
}
cout << strs[i] << " " << str << "\n";
}
return 0;
}

This code looks okay. Although I wonder what you would want with a string
such as "KFStat30A02".
- Show quoted text -
The strings come from a database. The "30" in that string represents
the 30 yr treasury bond. Only the first two strings (KFStat30A and
KFStat2A) were valid ones. I had put the other three strings just for
testing purpose.
Dec 7 '07 #6
On Dec 7, 7:26 am, "Daniel T." <danie...@earthlink.netwrote:
In article
<85ec7280-977f-4651-a3f4-2199b4150...@j44g2000hsj.googlegroups.com>,

Diwa <shettydiwa...@gmail.comwrote:
Hi Guys,
Is there any better way than below to find an int in a string (e.g.
"30" in "KFStat30A")
// --------------------------------------------------------------
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main()
{
vector<string strs ;
strs.push_back("KFStat30A");
strs.push_back("KFStat2A");
strs.push_back("555555");
strs.push_back("KKKKKK");
strs.push_back("KKKK555");
std::string str;
for (int i=0; i<strs.size(); i++)
{
str = "";
int beg = strs[i].find_first_of("0123456789");
if (beg != string::npos)
{
int end = strs[i].find_first_not_of("0123456789", beg);
str.assign(strs[i], beg, end-beg);
}
cout << strs[i] << " " << str << "\n";
}
return 0;
}
// --------------------------------------------------------------
Thanks

What you have is fine, just wrap it into a function and it will look
like this:

string get_int( const string& s )
{
string result;
string::size_type front = s.find_first_of( "0123456789" );
if ( front != string::npos )
{
string::size_type back =
s.find_first_not_of( "0123456789", front );
result.assign( s, front, back - front );
}
return result;

}

... or you can get creative:

bool is_digit( char c )
{
return isdigit( c );

}

string get_int( const string& s )
{
string::const_iterator front = find_if( s.begin(), s.end(),
&is_digit );
string::const_iterator back = find_if( front, s.end(),
compose1( logical_not<bool>(), ptr_fun( &is_digit ) ) );
return string( front, back );

}
What would the above func return if the string (e.g. KFStat30A55BB)
contains 2 ints instead of one ?
Dec 7 '07 #7
On Dec 7, 11:18 am, James Kanze <james.ka...@gmail.comwrote:
On Dec 6, 3:51 pm, Diwa <shettydiwa...@gmail.comwrote:
Is there any better way than below to find an int in a string
(e.g. "30" in "KFStat30A")

boost::regex.

If for some reason, you can't use Boost (most people probably
can't), then beg, borrow or steal some other regular expression
class. You don't want to do anything with text without one.
Thanks. That was what I originally wanted to use since we are using
boost anyway in our code. But later we decided against it since we do
not require any regex parsing except for this one. Boost regex would
have been an overkill especially considering the fact that boost regex
requires its library to be linked to the app. (If I am not wrong)
Dec 7 '07 #8
Diwa <sh***********@gmail.comwrote:
Daniel T. wrote:
string get_int( const string& s )
{
string result;
string::size_type front = s.find_first_of( "0123456789" );
if ( front != string::npos )
{
string::size_type back =
s.find_first_not_of( "0123456789", front );
result.assign( s, front, back - front );
}
return result;

}

... or you can get creative:

bool is_digit( char c )
{
return isdigit( c );

}

string get_int( const string& s )
{
string::const_iterator front = find_if( s.begin(), s.end(),
&is_digit );
string::const_iterator back = find_if( front, s.end(),
compose1( logical_not<bool>(), ptr_fun( &is_digit ) ) );
return string( front, back );

}

What would the above func return if the string (e.g. KFStat30A55BB)
contains 2 ints instead of one ?
The first int. Both "get_int" functions above work in the same way. They
scan the string looking for the first digit, then scan from there
looking for the first non-digit, then output a string containing all the
data between the two positions found.
Dec 7 '07 #9

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

143 posts views Thread by suri | last post: by
8 posts views Thread by Sandy | last post: by
19 posts views Thread by ashmangat@yahoo.com | last post: by
6 posts views Thread by TPJ | last post: by
7 posts views Thread by =?Utf-8?B?Q2hyaXM=?= | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.