C++ IsFloat函数

And*_*yUK 24 c++ string floating-point

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

bool IsFloat( string MyString )
{
   ... etc ...

   return ... // true if float; false otherwise
}
Run Code Online (Sandbox Code Playgroud)

Bil*_*ard 32

如果你不能使用Boost库函数,你可以像这样编写自己的isFloat函数.

#include <string>
#include <sstream>

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(); 
}
Run Code Online (Sandbox Code Playgroud)


Ada*_*ght 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<float>(someString);
  }
  catch (bad_lexical_cast &)
  {
    return false;
  }

  return true;
}
Run Code Online (Sandbox Code Playgroud)

你可以使用istream来避免需要Boost,但坦率地说,Boost太好了,不能遗漏.

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

Con*_*tin 5

受此答案的启发,我修改了函数以检查字符串是否为浮点数.它不需要提升并且不依赖于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();
  }
Run Code Online (Sandbox Code Playgroud)

1
2.
3.10000
4.2f
-5.3f
+6.2f
Run Code Online (Sandbox Code Playgroud)

被此函数正确识别为float.

1.0.0
2f
2.0f1
Run Code Online (Sandbox Code Playgroud)

是无效浮点数的示例.如果您不想以X.XXf格式识别浮点数,只需删除条件:

&& ((*it!='f') || it+1 != string.end() || !decimalPoint)
Run Code Online (Sandbox Code Playgroud)

从第9行开始.如果你不想识别没有"."的数字.如同浮动(即不是'1',只有'1','1.0','1.0f'...)那么您可以将最后一行更改为:

return string.size()>minSize && it == string.end() && decimalPoint;
Run Code Online (Sandbox Code Playgroud)

但是:有充分的理由使用boost的lexical_cast或使用stringstreams的解决方案而不是这个'丑陋的函数'.但它让我能够更好地控制我想要识别的哪种格式作为浮点数(即小数点后的最大位数......).


Yan*_*Liu 5

我最近写了一个函数来检查字符串是否是数字。这个数字可以是整数或浮点数。

您可以扭曲我的代码并添加一些单元测试。

bool isNumber(string s)
{
    std::size_t char_pos(0);

    // skip the whilespaces
    char_pos = s.find_first_not_of(' ');
    if (char_pos == s.size()) return false;


    // check the significand
    if (s[char_pos] == '+' || s[char_pos] == '-') ++char_pos; // skip the sign if exist

    int n_nm, n_pt;
    for (n_nm = 0, n_pt = 0; std::isdigit(s[char_pos]) || s[char_pos] == '.'; ++char_pos) {
        s[char_pos] == '.' ? ++n_pt : ++n_nm;
    }
    if (n_pt>1 || n_nm<1) // no more than one point, at least one digit
        return false;

    // skip the trailing whitespaces
    while (s[char_pos] == ' ') {
        ++ char_pos;
    }

    return char_pos == s.size();  // must reach the ending 0 of the string
}


void UnitTest() {
    double num = std::stod("825FB7FC8CAF4342");
    string num_str = std::to_string(num);

    // Not number
    assert(!isNumber("1a23"));
    assert(!isNumber("3.7.1"));
    assert(!isNumber("825FB7FC8CAF4342"));
    assert(!isNumber(" + 23.24"));
    assert(!isNumber(" - 23.24"));

    // Is number
    assert(isNumber("123"));
    assert(isNumber("3.7"));
    assert(isNumber("+23.7"));
    assert(isNumber("  -423.789"));
    assert(isNumber("  -423.789    "));
}
Run Code Online (Sandbox Code Playgroud)


use*_*431 5

我一直很喜欢,strtof因为它可以让你指定一个结束指针。

bool isFloat(const std::string& str)
{
    char* ptr;
    strtof(str.c_str(), &ptr);
    return (*ptr) == '\0';
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为结束指针指向解析开始失败的字符,因此如果它指向空终止符,则整个字符串将被解析为浮点数。

我很惊讶在这个问题出现的 10 年里没有人提到这个方法,我想是因为它更像是一种C 风格的方法。然而,它在 C++ 中仍然完全有效,并且比任何流解决方案都更优雅。此外,它还可以与“+inf”“-inf”等一起使用,并忽略前导空格。

编辑

不要被空字符串捕获,否则结束指针将位于 null 终止处(因此返回 true)。上面的代码应该是:

bool isFloat(const std::string& str)
{
    if (str.empty())
        return false;

    char* ptr;
    strtof(str.c_str(), &ptr);
    return (*ptr) == '\0';
}
Run Code Online (Sandbox Code Playgroud)