3.3. Testing Whether a String Contains a Valid Number
Problem
You have a string
and you need to
find out if it contains a valid number.
Solution
You can use the Boost lexical_cast
function
template to test for a valid number. Using this approach, a valid number can include a
preceding minus sign, or a preceding plus sign, but not whitespace. I give a few examples
of the kinds of formats that work with lexical_cast
in
Example 3-5.
Example 3-5. Validating a string number
#include <iostream> #include <boost/lexical_cast.hpp> using namespace std; using boost::lexical_cast; using boost::bad_lexical_cast; template<typename T> bool isValid(const string& num) { bool res = true; try { T tmp = lexical_cast<T>(num); } catch (bad_lexical_cast &e) { res = false; } return(res); } void test(const string& s) { if (isValid<int>(s)) cout << s << " is a valid integer." << endl; else cout << s << " is NOT a valid integer." << endl; if (isValid<double>(s)) cout << s << " is a valid double." << endl; else cout << s << " is NOT a valid double." << endl; if (isValid<float>(s)) cout << s << " is a valid float." << endl; else cout << s << " is NOT a valid float." << endl; } int main() { test("12345"); test("1.23456"); test("-1.23456"); test(" - 1.23456"); test("+1.23456"); test(" 1.23456 "); test("asdf"); }
Here’s the output from this example:
12345 is a valid integer. 12345 is a valid double. 12345 is a valid float. 1.23456 is NOT a valid integer. 1.23456 is a valid double. 1.23456 is a valid float. -1.23456 ...
Get C++ Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.