如何检查字符串是否反复出现负号?例如-1

时间:2018-09-04 13:29:40

标签: c++ c++11 filtering

我创建了一个告诉我是否只有数字的函数。

我尝试做-- ;,但这只会弄乱我的负数。

bool isDigit (const std::string &str) {
  return !(str.find_first_of("!@#$^&*()_=+abcdefghifklmnopqrst"
          "uvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") == std::string::npos);
}

2 个答案:

答案 0 :(得分:1)

您可以使用strtol来读取数字字符串并确定它们是否有效:

bool readNumber(const std::string& input, long& result) {
    char* end;
    result = strtol(input.c_str(), &end, 0);
    return *end == 0;
}

如果true是整数字符串,则返回input,并将整数值保存在result中。如果只需要检查字符串是否为整数,则可以忽略strtol的结果。

对于有效的整数字符串,该函数将始终返回true,但是如果result超出该范围,则将其限制为long的最小值/最大值。

答案 1 :(得分:0)

std::size_t nextNonDigit (const std::string &str, std::size_t pos) {
  return str.find_first_of(
      "!@#$^&*()_=+abcdefghifklmnopqrst"
      "uvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
      "-",
      pos
  );
}

bool isDigit(const std::string& str) {
  std::size_t number_minuses = 0;
  for(auto next = nextNonDigit(str, 0); next != std::string::npos;next = nextNonDigit(str, next+1)) {
    if (str[next] == '-') {
      ++number_minuses;
      if (number_minuses > 1)
        return false;
    }
  }
  return true;
}

如果您想支持,.,或者将其限制为.之间的一个,或3,或者您需要扩展它的其他内容。另外,这允许001-333作为数字。