有没有人知道确定字符串值是否"合格"为浮点数的便捷方法?
bool IsFloat( string MyString ) { ... etc ... return ... // true if float; false otherwise }
Bill the Liz.. 32
如果你不能使用Boost库函数,你可以像这样编写自己的isFloat函数.
#include#include bool isFloat( string myString ) { std::istringstream iss(myString); float f; iss >> noskipws >> f; // noskipws considers leading whitespace invalid // Check the entire string was consumed and if either failbit or badbit is set return iss.eof() && !iss.fail(); }
Adam Wright.. 12
你可能喜欢Boost的lexical_cast(参见http://www.boost.org/doc/libs/1_37_0/libs/conversion/lexical_cast.htm).
bool isFloat(const std::string &someString) { using boost::lexical_cast; using boost::bad_lexical_cast; try { boost::lexical_cast(someString); } catch (bad_lexical_cast &) { return false; } return true; }
你可以使用istream来避免需要Boost,但坦率地说,Boost太好了,不能遗漏.
如果你不能使用Boost库函数,你可以像这样编写自己的isFloat函数.
#include#include bool isFloat( string myString ) { std::istringstream iss(myString); float f; iss >> noskipws >> f; // noskipws considers leading whitespace invalid // Check the entire string was consumed and if either failbit or badbit is set return iss.eof() && !iss.fail(); }
你可能喜欢Boost的lexical_cast(参见http://www.boost.org/doc/libs/1_37_0/libs/conversion/lexical_cast.htm).
bool isFloat(const std::string &someString) { using boost::lexical_cast; using boost::bad_lexical_cast; try { boost::lexical_cast(someString); } catch (bad_lexical_cast &) { return false; } return true; }
你可以使用istream来避免需要Boost,但坦率地说,Boost太好了,不能遗漏.
受此答案的启发,我修改了函数以检查字符串是否为浮点数.它不需要提升并且不依赖于stringstreams failbit - 它只是简单的解析.
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(); }
即
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行开始.如果你不想识别没有"."的数字.如同浮动(即不是'1',只有'1','1.0','1.0f'...)那么您可以将最后一行更改为:
return string.size()>minSize && it == string.end() && decimalPoint;
但是:有充分的理由使用boost的lexical_cast或使用stringstreams的解决方案而不是这个'丑陋的函数'.但它让我能够更好地控制我想要识别的哪种格式作为浮点数(即小数点后的最大位数......).