要求stdin的有效浮点输入在C ++中具有2的精度

时间:2016-01-27 23:30:18

标签: c++ parsing

让我们说我们正在用std :: cin或从文件中读取一个浮点数,并希望强制它有两个尾随小数位的条件:

E.g。
4.01(有效)
4.001(无效 - 有三个尾随小数位)
a,47(无效,在' a'和'中有两个非[0-9]字符,')
#556.53(无效,有'#')

(仅针对上下文,在我的示例中,我从一个文本文件中解析,其中有几个以空格分隔的条目,验证每个输入,并将它们存储在结构中以供进一步处理。)

我们怎么做?

2 个答案:

答案 0 :(得分:0)

我在stackoverflow中从其他来源找到了这个。

C++ How to check an input float variable for valid input

这是实施。我们读为字符串,只接受任何字符不是数字(在perl中,我想我们可以简单地做一个正则表达式不匹配[0-9])。

显然,string中的find_first_not_of方法为我们做了这个:

  std::string a;

  if(!(std::cin>>a)){
    std::cout << "Invalid float entry " << std::endl;
  }

  if(a.find_first_not_of("1234567890.-")!=std::string::npos){
    std::cout << "Invalid string to float" << std::endl;}

接下来,我们通过搜索小数点的位置来验证字符串是否有两个小数位。

  if(a.size()-a.find(".")!=3){
    std::cout << "Valid float but must have two decimal places \n";
  }else{
    std::cout << "Accept - valid float and has two decimal places \n";
  }

最后,我们使用stof转换为float。

float u = stof(a);

答案 1 :(得分:0)

如果你有一个C ++编译器和标准库来实现C ++ 11,那么你可以使用一个非常简单的正则表达式:

#include <iostream>
#include <regex>
#include <string>

int main(int argc, char** argv) {
    std::string pattern("[-+]?\\d+\\.\\d\\d$");
    std::regex reg(pattern);
    for (int i = 1; i < argc; ++i) {
      std::cout << argv[i]
                << (std::regex_match(argv[i], reg) ? " matched\n" : " didn't match\n");
    }
    return 0;
}

该测试程序将值作为参数而不是从文件或流中读取它们,但修改它以使用istream是微不足道的。无需将字符串转换为C字符串; regex_match的第一个参数也可以是std::string,或者它甚至可以是value_type为char的一对迭代器。在这种情况下,使用char*恰好是方便的。

See it live on coliru.