让我们说我们正在用std :: cin或从文件中读取一个浮点数,并希望强制它有两个尾随小数位的条件:
E.g。
4.01(有效)
4.001(无效 - 有三个尾随小数位)
a,47(无效,在' a'和'中有两个非[0-9]字符,')
#556.53(无效,有'#')
(仅针对上下文,在我的示例中,我从一个文本文件中解析,其中有几个以空格分隔的条目,验证每个输入,并将它们存储在结构中以供进一步处理。)
我们怎么做?
答案 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*
恰好是方便的。