当前位置:  开发笔记 > 编程语言 > 正文

C++ IsFloat函数

如何解决《C++IsFloat函数》经验,为你挑选了3个好方法。

有没有人知道确定字符串值是否"合格"为浮点数的便捷方法?

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太好了,不能遗漏.



1> Bill the Liz..:

如果你不能使用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(); 
}



2> Adam Wright..:

你可能喜欢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太好了,不能遗漏.


请不要将异常用作控制流机制
他没有使用流量控制的例外.他正在抓住一个棘手的例外(http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-exceptions.aspx).

3> Constantin..:

受此答案的启发,我修改了函数以检查字符串是否为浮点数.它不需要提升并且不依赖于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的解决方案而不是这个'丑陋的函数'.但它让我能够更好地控制我想要识别的哪种格式作为浮点数(即小数点后的最大位数......).

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有