How to check if a string contains any digits in C ++

I want to know if a string has any digits or not digits. Is there a function that does this easily?

+6
c ++ string
source share
6 answers

Perhaps the following:

if (std::string::npos != s.find_first_of("0123456789")) { std::cout << "digit(s)found!" << std::endl; } 
+18
source share
 boost::regex re("[0-9]"); const std::string src = "test 123 test"; boost::match_results<std::string::const_iterator> what; bool search_result = boost::regex_search(src.begin(), src.end(), what, re, boost::match_default); 
+7
source share
 #include <cctype> #include <algorithm> #include <string> if (std::find_if(s.begin(), s.end(), (int(*)(int))std::isdigit) != s.end()) { // contains digit } 
+6
source share

find_first_of is probably your best bet, but I played with iostream facets, so here's an alternative:

 if ( use_facet< ctype<char> >( locale() ).scan_is( ctype<char>::digit, str.data(), str.data() + str.size() ) != str.data + str.size() ) 

Change string to wstring and char to wchar , and theoretically you might be able to handle these weird fixed-width digits used in some Asian scripts.

+3
source share

given by std :: String s;

 if( s.find_first_of("0123456789")!=std::string::npos ) //digits 
+2
source share

There is nothing standard for this purpose, but it is not difficult to do:

 template <typename CharT> bool has_digits(std::basic_string<CharT> &input) { typedef typename std::basic_string<CharT>::iterator IteratorType; IteratorType it = std::find_if(input.begin(), input.end(), std::tr1::bind(std::isdigit<CharT>, std::tr1::placeholders::_1, std::locale())); return it != input.end(); } 

And you can use it like this:

 std::string str("abcde123xyz"); printf("Has digits: %s\n", has_digits(str) ? "yes" : "no"); 

Edit:

Or even a better version (since it can work with any container and with const and non-const containers):

 template <typename InputIterator> bool has_digits(InputIterator first, InputIterator last) { typedef typename InputIterator::value_type CharT; InputIterator it = std::find_if(first, last, std::tr1::bind(std::isdigit<CharT>, std::tr1::placeholders::_1, std::locale())); return it != last; } 

And this one you can use, for example:

 const std::string str("abcde123xyz"); printf("Has digits: %s\n", has_digits(str.begin(), str.end()) ? "yes" : "no"); 
+2
source share

All Articles