небезопасно и для этого имеются лучшие альтернативы.
Глава 10.
3.3. Проверка, содержит ли строка допустимое число
Имеется строка string
и требуется определить, содержит ли она допустимое число.
Для проверки допустимости числа можно использовать шаблон функции lexical_cast
библиотеки Boost. При таком подходе допустимое число может включать предшествующий знак минус, предшествующий знак плюс, но не пробел. В примере 3.5 приводятся несколько образцов типов форматов, с которыми работает lexical_cast
.
#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 << ' - допустимое целое число.' << endl;
else
cout << s << ' - HE допустимое целое число.' << endl;
if (isValid<double>(s))
cout << s << ' - допустимое число двойной точности.' << endl;
else
cout << s << ' - HE допустимое число двойной точности.' << endl;
if (isValid<float>(s))
cout << s << ' - допустимое число одинарной точности.' << endl;
else
cout << s << ' - HE допустимое число одинарной точности ' << endl;
}
int main() {
test('12345');
test('1.23456');
test('-1.23456');
test(' - 1.23456');
test('+1.23456');
test(' 1.23456 ');
test('asdf');
}
Вот вывод этого примера.
12345 - допустимое целое число.
12345 - допустимое число двойной точности.
12345 - допустимое число одинарной точности.
1.23456 - НЕ допустимое целое число.
1.23456 - допустимое число двойной точности.
1.23456 - допустимое число одинарной точности.
-1.23456 - НЕ допустимое целое число.
-1.23456 - допустимое число двойной точности.
-1.23456 - допустимое число одинарной точности.
- 1.23456 - НЕ допустимое целое число.
- 1 23466 - НЕ допустимое число двойной точности.
- 1.23456 - НЕ допустимое число одинарной точности.
+1.23456 - НЕ допустимое целое число.
+1.23456 - допустимое число двойной точности.
+1.23456 - допустимое число одинарной точности.
1.23456 - НЕ допустимое целое число.
1.23456 - НЕ допустимое число двойной точности.
1.23456 - НЕ допустимое число одинарной точности.
asdf - НЕ допустимое целое число.
asdf - НЕ допустимое число двойной точности.
asdf - НЕ допустимое число одинарной точности.
Шаблон функции lexical_cast
преобразует значение из одного типа в другой. Он объявлен следующим образом.
template<typename Target, typename Source>
Target lexical_cast(Source arg)
Source
— это тип оригинальной переменной, a Target
— это тип переменной, в которую значение преобразуется. Таким образом, например, чтобы преобразовать из string
в int
, вызов lexical_cast
имеет вид:
int i = lexical_cast<int>(str); // str - это строка
lexical_cast
проводит анализ и пытается выполнить преобразование. Если преобразование невозможно, он выбрасывает исключение bad_lexical_cast
. В примере 3.5 я только хочу проверить допустимость, и мне не требуется сохранять целевую переменную, так что если исключение не выбрасывается, я возвращаю true
, а в противном случае — false
.
В lexical_cast
требуется передать только первый аргумент, поскольку это шаблон, что означает, что компилятор может догадаться, какой тип имеет аргумент функции, и использовать его в качестве второго аргумента. Пояснение этой ситуации более сложно, чем простая демонстрация, так что позвольте мне использовать фрагмент кода примера. Вместо того чтобы вызывать