Вдохновленный этим ответом Я изменил функцию, чтобы проверить, является ли строка числом с плавающей запятой. Он не требует увеличения и не зависит от бит-потока строк - это просто разбор.
static bool isFloatNumber(const std::string& string){
std::string::const_iterator it = string.begin();
bool decimalPoint = false;
int minSize = 0;
if(string.size()>0 && (string[0] == '-' || string[0] == '+')){
it++;
minSize++;
}
while(it != string.end()){
if(*it == '.'){
if(!decimalPoint) decimalPoint = true;
else break;
}else if(!std::isdigit(*it) && ((*it!='f') || it+1 != string.end() || !decimalPoint)){
break;
}
++it;
}
return string.size()>minSize && it == string.end();
}
* 1006 Т.е. *
1
2.
3.10000
4.2f
-5.3f
+6.2f
правильно распознается этой функцией как float.
1.0.0
2f
2.0f1
Примеры недопустимых операций с плавающей точкой. Если вы не хотите распознавать числа с плавающей запятой в формате X.XXf, просто удалите условие:
&& ((*it!='f') || it+1 != string.end() || !decimalPoint)
из строки 9.
И если вы не хотите распознавать числа без «.» как float (то есть не '1', только '1.', '1.0', '1.0f' ...), тогда вы можете изменить последнюю строку на:
return string.size()>minSize && it == string.end() && decimalPoint;
Однако: есть много веских причин использовать lexical_cast для boost или решение, использующее stringstreams, а не эту «уродливую функцию». Но это дает мне больше контроля над тем, какие именно форматы я хочу распознавать как числа с плавающей запятой (т.е. максимальные цифры после десятичной запятой ...).