将字符串解析为数字或数字和百分比符号

时间:2012-03-12 11:33:09

标签: c++ string parsing

在C ++中,更好的是没有Boost库,如何确保std :: string str包含一个数字或一个数字后跟'%'符号?如果它不属于这两种情况,则应发出错误。

4 个答案:

答案 0 :(得分:1)

最简单的解决方案可能是转换字符串(使用strtolstrtod,取决于您期望的数字类型,然后查看 以下字符。类似的东西:

(已编辑以纠正错误处理):

bool
isNumberOrPercent( std::string const& value )
{
    char const* end;
    errno = 0;
    strtod( value.c_str(), &end );
    return errno == 0 
        && (*end = '%' ? end + 1 : end) - value.c_str() == value.size();
}

答案 1 :(得分:1)

#include <iostream>
#include <string>
#include <algorithm>
#include <ctype.h>
bool is_a_bad_char(char c) {
  return !(isdigit(c) || (c=='%'));
}

int main() {
  std::string str = "123123%4141219";
  if (std::find_if(str.begin(), str.end(), is_a_bad_char) != str.end()) {
    std::cout << "error" << std::endl;
    return 1;
  }
  return 0;
}

答案 2 :(得分:0)

  1. find_first_not_of包含所有数字和%
  2. 如果上述内容返回npos,请检查最后一个字符%

答案 3 :(得分:0)

不是很C ++ - 是的,但这样的事情会这样做:

#include <cstdlib>
#include <cstring>

bool checkformat(const std::string &s) {
    const char *begin = s.c_str();
    char *end;
    double val = std::strtod(begin, &end);
    if (end == begin) return false;
    if (*end == '%') ++end;
    return (end - begin == s.size());
}

请注意strtod跳过初始空格,因此如果您不想接受带有初始空格的字符串,那么您需要单独拒绝该空格。它还接受"NAN""INF""INFINITY"(所有不区分大小写),并且每个事件都以+-开头,并且在这种情况下"NAN"可选地跟随一些实现定义的字符以指示它代表的 NaN值。可以说“INF”是一个数字,但根据定义“NAN”不是,所以如果val != val你想要返回false,也可能检查无穷大。

[编辑:我认为我已经解决了詹姆斯提出的问题,除了" "" %"仍有争议。然后他补充了溢出。在他和我的回答之间,你应该明白这一点 - 首先决定你要如何对待每个边缘案例,然后对其进行编码。]