November 2005
Beginner to intermediate
594 pages
16h 23m
English
You have a string and you need to
find out if it contains a valid number.
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 ...