문자열이 C ++의 숫자인지 확인하는 방법은 무엇입니까?


136

문자열이 숫자인지 확인하는 함수를 작성하는 데 약간의 문제가있었습니다. 내가 쓰고있는 게임의 경우 읽고있는 파일의 줄이 숫자인지 확인해야합니다 (이 방법으로 매개 변수인지 알 수 있습니다). 나는 부드럽게 작동한다고 생각하는 아래 기능을 작성했습니다 (또는 실수로 편집하지 않거나 정신 분열증이거나 Windows가 정신 분열증입니다).

bool isParam (string line)
{
    if (isdigit(atoi(line.c_str())))
        return true;

    return false;
}

184
나는 보고 싫어if (expr) return true; return false; ! 그냥 쓰십시오 return expr;.
ephemient

17
@ephemient 내 스타일은 당신과 같은 일을하는 것입니다. 하지만 정말 큰 일입니까?
Brennan Vincent

2
함수 프로토 타입이 적절하지 않은 것 같습니다. bool isParam (const string & line)을 사용하지 않는 이유
MikimotoH

4
네. 새로운 언어를 배울 때 긴 스타일을 코딩하는 나쁜 습관이 있습니다. 저는 C ++을 처음 사용하고 "바로 가기"(또는 인식 된 바로 가기)에 더 주저합니다.
Brendan Weinstein

57
@Brennan Vincent : 그렇습니다. 큰 문제입니다. 그것은 실수로 같은 클래스의 if (expr) return expr; else return expr;, if (expr == true), (if expr != false), 또는 if ((expr == true) == true). 코드 작성기, 리더기 또는 컴파일러에 도움이되지 않는 복잡성을 모두 소개합니다. 불필요한 복잡성을 제거하는 것은 지름길이 아닙니다. 더 나은 소프트웨어를 작성하는 것이 중요합니다.
MSalters

답변:


148

가장 효율적인 방법은 숫자가 아닌 문자를 찾을 때까지 문자열을 반복하는 것입니다. 숫자가 아닌 문자가 있으면 문자열을 숫자가 아닌 것으로 간주 할 수 있습니다.

bool is_number(const std::string& s)
{
    std::string::const_iterator it = s.begin();
    while (it != s.end() && std::isdigit(*it)) ++it;
    return !s.empty() && it == s.end();
}

또는 C ++ 11 방식으로 수행하려면 다음을 수행하십시오.

bool is_number(const std::string& s)
{
    return !s.empty() && std::find_if(s.begin(), 
        s.end(), [](unsigned char c) { return !std::isdigit(c); }) == s.end();
}

아래 주석에서 지적했듯이 양의 정수에만 작동합니다. 음의 정수 또는 분수를 감지해야하는 경우보다 강력한 라이브러리 기반 솔루션을 사용해야합니다. 음의 정수에 대한 지원을 추가하는 것은 쉽지 않습니다.


6
음수 및 비정 수도 처리하지 않습니다. 질문에 따라 요구 사항이 무엇인지 알 수 없습니다.
Brennan Vincent

76
!s.empty() && s.find_first_not_of("0123456789") == std::string::npos;C ++ 03 단일 라이너 에도 사용할 수 있습니다 .
kbjorklu

8
또한 소수 예를 처리하지 않습니다 : 1.23
littlecodefarmer758

3
@ 레미 레보, 그렇습니다. 실제로 문자열을로 변환하지 않습니다 int. 문자열이 숫자로 구성되어 있는지 여부 만 식별합니다. 문자열의 길이는 중요하지 않습니다.
Charles Salvia

5
C ++ 11 예제 를 포함 <string> <algorithm>시키고 작동 <cctype>시키는 것을 잊지 마십시오 .
kR105

88

왜 바퀴를 재발 명합니까? C 표준 라이브러리 (C ++에서도 사용 가능)에는 정확히 다음을 수행하는 기능이 있습니다.

char* p;
long converted = strtol(s, &p, 10);
if (*p) {
    // conversion failed because the input wasn't a number
}
else {
    // use converted
}

분수 또는 과학적 표기법을 처리 strtod하려면 대신에 double결과를 얻으십시오 .

C / C ++ 스타일 ( "0xABC") 에서 16 진 및 8 진 상수를 허용 하려면 0대신 마지막 매개 변수를 작성하십시오 .

그러면 함수는 다음과 같이 쓸 수 있습니다

bool isParam(string line)
{
    char* p;
    strtol(line.c_str(), &p, 10);
    return *p == 0;
}

4
이 함수는 공백을 앞에 버립니다. 따라서 첫 번째 문자에서 isdigit를 확인해야합니다.
chmike

1
@chmike : 질문에 대한 나의 이해를 바탕으로 선행 공백을 버리는 것이 올바른 동작입니다 ( atoi질문에 사용 된 것처럼).
Ben Voigt 2016 년

1
질문에 명시 적으로 지정하지 않았지만 요구 사항에 대한 내 이해 "문자열이 숫자인지 확인"은 전체 문자열이 숫자이므로 공백이 없음을 의미합니다. 나는 이와 관련하여 당신의 대답이 다른 사람들과 다르다는 것을 지적 할 필요가 있다고 느꼈습니다. 문자열 앞에 숫자가 공백으로 있으면 괜찮을 것입니다.
chmike

1
@BenVoigt 당신 은 성공 하면 p설정 될 것이라고 말하는거야 ? 그것은 내가보고있는 것이 아닙니다 :(nullptrstrtol
Jonathan Mee

2
@JonathanMee : 아니요 p. 문자열을 종료하는 NUL을 가리 킵니다. 그래서 p != 0*p == 0.
벤 Voigt

33

C ++ 11 컴파일러를 사용하면 음이 아닌 정수에 대해 다음과 같은 것을 사용합니다 ( ::대신에 참고 std::).

bool is_number(const std::string &s) {
  return !s.empty() && std::all_of(s.begin(), s.end(), ::isdigit);
}

http://ideone.com/OjVJWh


1
이것이 가장 좋은 대답입니다.
Martin Broadhurst

문자열에 utf8 문자가 있으면 런타임 오류가 발생합니다.
라이온 킹

29

boost :: lexical_cast를 사용하여 C ++ 방식으로 할 수 있습니다. 부스트를 사용하지 말 것을 정말로 주장한다면 그 기능을 검사하고 수행 할 수 있습니다. 꽤 간단합니다.

try 
{
  double x = boost::lexical_cast<double>(str); // double could be anything with >> operator.
}
catch(...) { oops, not a number }

21
사용하여 try{} catch{}좋은 생각을? 최대한 피해야합니까?
Nawaz


14
try {} catch {}가 여기에 적합합니다. 그러나 catch (...)는 나쁜 습관입니다. 이 경우 예외 처리기에 boost :: bad_lexical_cast를 사용하십시오.
NuSkooler

5
파일에서 읽으려고하는 것 같습니다. 파일을 얼마나 많이 확인하더라도 파일을 읽을 때까지 읽을 수 있는지 알 수 없습니다. 작동하거나 작동하지 않을 것입니다. 어떤 경우에는 예외를 잡아야합니다. 따라서이 경우에는 이것이 완전히 훌륭한 방법이라고 생각합니다.
Casey

4
@EarlGray-나는 OS에 의존하는 윈도우가 무엇을 할 것인지에 관심이 있습니다. 표준은이 코드의 작동 방식에 대해 매우 명확합니다.
Edward Strange

16

반복을 사용하는이 아이디어를 던지기를 원했지만 다른 코드는 반복을 수행합니다.

#include <string.h>

bool is_number(const std::string& s)
{
    return( strspn( s.c_str(), "-.0123456789" ) == s.size() );
}

소수점이나 빼기 기호를 확인할 때처럼 각 위치와 위치에 둘 이상이있을 수 있기 때문에 견고하지 않습니다. 좋은 점은 한 줄의 코드이며 타사 라이브러리가 필요하지 않다는 것입니다.

'.'을 꺼내십시오. 양의 정수가 모두 허용되는 경우 '-'.


오류 : 'strspn'이이 범위에서 선언되지 않았습니다. 이것은 "#include"가 누락 되었기 때문이라고 생각합니다.
Qwertie

4
를 사용 std::string하려면 find_first_not_of멤버 함수를 사용하십시오.
벤 Voigt

5
"12.3-4.55-"문자열을 전달하면 실패합니다. 이는 분명히 유효한 숫자가 아닙니다
Buzzrick

Buzzrick, 제안 된 답변은 이미 언급 한 숫자가 아닌 숫자로는 실패 할 것이라고 말합니다.
David Rector

당신은 단지 그것을 제한하는 경우 "0123456789"다음 공식은 부호없는 정수에 대한 테스트에 적합하지 않습니다
아무도 특별한

16

정규식 접근 방식을 제안합니다. 전체 정규 표현식 일치 (예 : boost :: regex 사용 )

-?[0-9]+([\.][0-9]+)?

문자열이 숫자인지 아닌지를 보여줍니다. 여기에는 양수와 음수, 정수 및 소수가 포함됩니다.

다른 변형 :

[0-9]+([\.][0-9]+)?

(긍정적)

-?[0-9]+

(정수만)

[0-9]+

(양의 정수만)


Ahem, 나는 std::regexgcc 4.7, gcc 4.8과 함께 사용하려고 시도했다. 둘 다 무고한 "[abc]"(정확하지 않은가?)에도 정규 표현식의 std::regex_error표시를 던진다 [. clang-3.4는 전혀 알지 못합니다 <regex>. 어쨌든, 이것은 +1의 가장 해답 인 것처럼 보입니다.
Dmytro Sirenko

3
@EarlGray : Regex는 GCC 4.9에서만 올바로 제공됩니다.
궤도

13

<regex>라이브러리를 사용하여 수행하는 다른 방법은 다음과 같습니다 .

bool is_integer(const std::string & s){
    return std::regex_match(s, std::regex("[(-|+)|][0-9]+"));
}

아, 그래 더 나은 솔루션으로 업데이트했습니다. 감사.
mpataki14

"[(-| +) |] [0-9] + (별표 대신 플러스)가 아니어야합니다. 그렇지 않으면 정규식이"- "또는"+ "에서 유효한 숫자로 일치 할 수 있습니다.
David Mulder

좋은. 첫 번째 문자 클래스에서 (, | 및)가 무엇을하는지 잘 모르겠습니다.이 메타 문자는 내가 아는 한 문자 클래스 내에서 특별한 의미를 잃습니다. "^ [-+]? [0-9] + $"는 어떻습니까?
U007D

비효율적 일 수 있습니다. 이것을 호출 할 때마다 정규 표현식을 컴파일하는 std :: regex 생성자를 호출합니다.
user31264

12

이 솔루션을 사용하면 음수부터 양수, 심지어 부동 수까지 모든 것을 확인할 수 있습니다. 의 유형 num을 정수로 변경하면 문자열에 점이 있으면 오류가 발생합니다.

#include<iostream>
#include<sstream>
using namespace std;


int main()
{
      string s;

      cin >> s;

      stringstream ss;
      ss << s;

      float num = 0;

      ss >> num;

      if(ss.good()) {
          cerr << "No Valid Number" << endl;
      }
      else if(num == 0 && s[0] != '0') {
          cerr << "No Valid Number" << endl;
      }
      else {
          cout << num<< endl;
      }             
}

증명 : C ++ 프로그램


10

다음 코드가 가장 강력하다는 것을 알았습니다 (c ++ 11). 정수와 수레를 모두 잡습니다.

#include <regex>
bool isNumber( std::string token )
{
    return std::regex_match( token, std::regex( ( "((\\+|-)?[[:digit:]]+)(\\.(([[:digit:]]+)?))?" ) ) );
}

using namespace std;이 불필요한 것 같습니다 .
Xam

5

양의 정수를 확인하는 솔루션은 다음과 같습니다.

bool isPositiveInteger(const std::string& s)
{
    return !s.empty() && 
           (std::count_if(s.begin(), s.end(), std::isdigit) == s.size());
}

5

이 시도:

isNumber(const std::string &str) {    
  return !str.empty() && str.find_first_not_of("0123456789") == string::npos;
}

1
단지 부호없는 정수에 대한이 테스트
아무 특별한

4

브렌든이

bool isNumber(string line) 
{
    return (atoi(line.c_str())); 
}

거의 괜찮습니다.

0으로 시작하는 문자열이 숫자라고 가정하면이 경우 확인을 추가하십시오.

bool isNumber(const string &line) 
{
 if (line[0] == '0') return true;
 return (atoi(line.c_str()));
}

ofc "123hello"는 Tony D가 지적한 것처럼 true를 반환합니다.



3

C ++ (11) 정규식 (사용하여 내 솔루션은 #include <regex>), 그것은 더 정확한 검사처럼 사용할 수 있습니다 unsigned int, double등 :

static const std::regex INT_TYPE("[+-]?[0-9]+");
static const std::regex UNSIGNED_INT_TYPE("[+]?[0-9]+");
static const std::regex DOUBLE_TYPE("[+-]?[0-9]+[.]?[0-9]+");
static const std::regex UNSIGNED_DOUBLE_TYPE("[+]?[0-9]+[.]?[0-9]+");

bool isIntegerType(const std::string& str_)
{
  return std::regex_match(str_, INT_TYPE);
}

bool isUnsignedIntegerType(const std::string& str_)
{
  return std::regex_match(str_, UNSIGNED_INT_TYPE);
}

bool isDoubleType(const std::string& str_)
{
  return std::regex_match(str_, DOUBLE_TYPE);
}

bool isUnsignedDoubleType(const std::string& str_)
{
  return std::regex_match(str_, UNSIGNED_DOUBLE_TYPE);
}

이 코드는 http://ideone.com/lyDtfi 에서 찾을 수 있으며 요구 사항에 맞게 쉽게 수정할 수 있습니다.


다운 보터에게 문제를 이해하도록 도와달라고 요청하면 답변을 개선하겠습니다. 감사.
aniliitb10

2

kbjorklu의 의견을 기반으로 한 솔루션 은 다음과 같습니다.

bool isNumber(const std::string& s)
{
   return !s.empty() && s.find_first_not_of("-.0123456789") == std::string::npos;
}

와 마찬가지로 다윗 목사의 대답 은 여러 점 또는 마이너스 기호 문자열에 강력한 아니라, 단지 정수를 확인하기 위해 당신은 그 문자를 제거 할 수 있습니다.


그러나 나는 cstdlib에서 십진수 값, 과학 / 공학 표기법, 16 진수 표기법 (C ++ 11) 또는 심지어 INF / INFINITY / NAN (C ++ 11)을 사용하여 Ben Voigt의 솔루션을 기반으로 한 솔루션의 일부입니다. strtod입니다 :

bool isNumberC(const std::string& s)
{
    char* p;
    strtod(s.c_str(), &p);
    return *p == 0;
}

2

우리는 문자열 스트림 클래스를 사용할 수 있습니다 .

    bool isNumeric(string str)
    {
       stringstream stream;                   
       double number;

       stream<<str;
       stream>>number;

       return stream.eof();
    }

2

사용 <regex>. 이 코드는 테스트되었습니다!

bool isNumber(const std::string &token)
{
    return std::regex_match(token, std::regex("(\\+|-)?[0-9]*(\\.?([0-9]+))$"));
}

1

설명서를 좀 더 자세히 살펴본 후에는 내 요구를 지원하는 답변을 찾았지만 다른 사람들에게는 도움이되지 않을 것입니다. 여기에 있습니다 (성가신 반환 true 및 false 문 반환 :-))

bool isNumber(string line) 
{
    return (atoi(line.c_str())); 
}

4
숫자가 인 경우 0거짓 음수를 얻게됩니다.
Charles Salvia

3
이것은 선행 숫자를 반환하고 후행 쓰레기를 경고하지 않습니다 (예 : "123hello"==> 123). @Charles : Brendan은 다른 답변에 대한 의견에서 긍정적 인 정수 만 인식하면된다고 언급했습니다.
Tony Delroy

1

이 정규 표현식은 거의 모든 경우를 처리해야한다고 생각합니다.

"^(\\-|\\+)?[0-9]*(\\.[0-9]+)?"

(유니 코드 및 ANSI) 모두에서 작동 할 수있는 다음 기능을 시도 할 수 있습니다

bool IsNumber(CString Cs){
Cs.Trim();

#ifdef _UNICODE
std::wstring sr = (LPCWSTR)Cs.GetBuffer(Cs.GetLength());
return std::regex_match(sr, std::wregex(_T("^(\\-|\\+)?[0-9]*(\\.[0-9]+)?")));

#else
    std::string s = (LPCSTR)Cs.GetBuffer();
return std::regex_match(s, std::regex("^(\\-|\\+)?[0-9]*(\\.[0-9]+)?"));
#endif
}

1
include <string>

복식 확인의 경우 :

bool validateDouble(const std::string & input) {
int decimals = std::count(input.begin(), input.end(), '.'); // The number of decimals in the string
int negativeSigns = std::count(input.begin(), input.end(), '-'); // The number of negative signs in the string

if (input.size() == decimals + negativeSigns) // Consists of only decimals and negatives or is empty
    return false;
else if (1 < decimals || 1 < negativeSigns) // More than 1 decimal or negative sign
    return false;
else if (1 == negativeSigns && input[0] != '-') // The negative sign (if there is one) is not the first character
    return false;
else if (strspn(input.c_str(), "-.0123456789") != input.size()) // The string contains a character that isn't in "-.0123456789"
    return false;
return true;

}

정수 유효성 검사 (음수 포함)

bool validateInt(const std::string & input) {
int negativeSigns = std::count(input.begin(), input.end(), '-'); // The number of negative signs in the string

if (input.size() == negativeSigns) // Consists of only negatives or is empty
    return false;
else if (1 < negativeSigns) // More than 1 negative sign
    return false;
else if (1 == negativeSigns && input[0] != '-') // The negative sign (if there is one) is not the first character
    return false;
else if (strspn(input.c_str(), "-0123456789") != input.size()) // The string contains a character that isn't in "-0123456789"
    return false;
return true;

}

부호없는 정수의 유효성 검사

bool validateUnsignedInt(const std::string & input) {
return (input.size() != 0 && strspn(input.c_str(), "0123456789") == input.size()); // The string is not empty and contains characters only in "0123456789"

}


1
bool isNumeric(string s){
    if ( !s.empty() && s[0] != '-' )
        s = "0" + s; //prepend 0

    string garbage;

    stringstream ss(s); 
    ss >> *(auto_ptr<double>(new double)) >> garbage;
/*
//the line above extracts the number into an anonymous variable. it could also be done like this:
double x;
ss >> x >> garbage;
*/
    //if there is no garbage return true or else return false
    return garbage.empty(); 
}

작동 방식 : 문자열 스트림 >> 과부하는 문자열을 다양한 산술 유형으로 변환 할 수 있습니다. 문자열이 부족해질 때까지 문자열 스트림 (이 경우 ss)에서 문자를 순차적으로 읽거나 다음 문자가 저장 기준을 충족하지 않습니다. 대상 변수 유형으로.

예 1 :

stringstream ss("11");
double my_number;
ss >> my_number; //my number = 11

예 2 :

stringstream ss("011");
double my_number;
ss >> my_number; //my number = 11

예 3 :

stringstream ss("11ABCD");
double my_number;
ss >> my_number; //my number = 11 (even though there are letters after the 11)

"쓰레기"변수 설명 ":

왜 내 double 로의 추출에 유효한 값이 있는지 확인한 다음 true를 반환하지 않습니까?

입력 문자열이 "11ABCD"(숫자가 아님) 인 경우에도 위의 example3은 여전히 ​​숫자 11을 my_number 변수로 읽습니다.

이 경우를 처리하기 위해 문자열 변수 (가비지라는 이름)로 다시 추출하여 double 유형의 변수로 초기 추출 후 문자열 버퍼에 남아있을 수있는 모든 것을 읽을 수 있습니다. 남은 것이 있으면 "쓰레기"로 읽어들입니다. 이는 전달 된 전체 문자열이 숫자가 아님을 의미합니다 (단지 1로 시작 함). 이 경우 우리는 false를 반환하고 싶습니다;

앞에 붙은 "0"설명 ":

단일 문자를 이중으로 추출하려고 시도하면 실패하지만 (0을 이중으로 리턴) 문자열 버퍼 위치를 문자 다음으로 계속 이동합니다. 이 경우 가비지 읽기가 비어서 함수가 true를 잘못 리턴합니다. 이 문제를 해결하기 위해 문자열 앞에 0을 추가하여 전달 된 문자열이 "a"인 경우 "0a"로 변경되어 0이 이중으로 추출되고 "a"가 가비지로 추출됩니다.

앞에 0을 붙이면 숫자 값에 영향을 미치지 않으므로 숫자가 여전히 이중 변수로 올바르게 추출됩니다.


1
이 코드는 질문에 대답 할 수 있지만,이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
Ajean

1

문자열이 정수 또는 부동 소수점인지 확인하려면 다음을 사용할 수 있습니다.

 #include <sstream>

    bool isNumber(string str) {
    double d;
    istringstream is(str);
    is >> d;
    return !is.fail() && is.eof();
}

1
"10_is_not_a_number"값을 포함하는 문자열에 대해 10을 반환합니다.
KorreyD

1

또 다른 대답은 사용합니다 stold( 정밀도가 필요하지 않은 경우 stof/ 를 사용할 수도 있음 stod).

bool isNumeric(const std::string& string)
{
    std::size_t pos;
    long double value = 0.0;

    try
    {
        value = std::stold(string, &pos);
    }
    catch(std::invalid_argument&)
    {
        return false;
    }
    catch(std::out_of_range&)
    {
        return false;
    }

    return pos == string.size() && !std::isnan(value);
}


1

이 시도:

bool checkDigit(string str)
{  
   int n=str.length();

   for(int i=0;    i   < n ;   i++)
   {
     if(str[i]<'0' || str[i]>'9')
       return false;
   }

   return true;
}

1

boost :: lexical_cast 를 사용하여 문자열을 정수로 변환 할 수 있는지 테스트 할 수 있습니다 . 이 발생하는 경우 bad_lexical_cast , 문자열 다음 예외가 변환 할 수 없습니다 그렇지 않으면 할 수 있습니다.

아래 테스트 프로그램의 예를 참조하십시오.

#include <boost/lexical_cast.hpp>
#include <iostream>

int main(int, char** argv)
{
        try
        {
                int x = boost::lexical_cast<int>(argv[1]);
                std::cout << x << " YES\n";
        }
        catch (boost::bad_lexical_cast const &)
        {
                std:: cout << "NO\n";
        }
        return 0;
}

샘플 실행 :

# ./a.out 12
12 YES
# ./a.out 12/3
NO

0

몇 달 전에 문자열이 정수, 16 진수 또는 이중인지 확인하는 방법을 구현했습니다.

enum{
        STRING_IS_INVALID_NUMBER=0,
        STRING_IS_HEXA,
        STRING_IS_INT,
        STRING_IS_DOUBLE
};

bool isDigit(char c){
    return (('0' <= c) && (c<='9'));
}

bool isHexaDigit(char c){
    return ((('0' <= c) && (c<='9')) || ((tolower(c)<='a')&&(tolower(c)<='f')));
}


char *ADVANCE_DIGITS(char *aux_p){

    while(CString::isDigit(*aux_p)) aux_p++;
    return aux_p;
}

char *ADVANCE_HEXADIGITS(char *aux_p){

    while(CString::isHexaDigit(*aux_p)) aux_p++;
    return aux_p;
}


int isNumber(const string & test_str_number){
    bool isHexa=false;
    char *str = (char *)test_str_number.c_str();

    switch(*str){
    case '-': str++; // is negative number ...
               break;
    case '0': 
              if(tolower(*str+1)=='x')  {
                  isHexa = true;
                  str+=2;
              }
              break;
    default:
            break;
    };

    char *start_str = str; // saves start position...
    if(isHexa) { // candidate to hexa ...
        str = ADVANCE_HEXADIGITS(str);
        if(str == start_str)
            return STRING_IS_INVALID_NUMBER;

        if(*str == ' ' || *str == 0) 
            return STRING_IS_HEXA;

    }else{ // test if integer or float
        str = ADVANCE_DIGITS(str);
        if(*str=='.') { // is candidate to double
            str++;
            str = ADVANCE_DIGITS(str);
            if(*str == ' ' || *str == 0)
                return STRING_IS_DOUBLE;

            return STRING_IS_INVALID_NUMBER;
        }

        if(*str == ' ' || *str == 0)
            return STRING_IS_INT;

    }

    return STRING_IS_INVALID_NUMBER;


}

그런 다음 프로그램에서 다음을 수행하면 함수에서 숫자를 유형으로 쉽게 변환 할 수 있습니다.

string val; // the string to check if number...

switch(isNumber(val)){
   case STRING_IS_HEXA: 
   // use strtol(val.c_str(), NULL, 16); to convert it into conventional hexadecimal
   break;
   case STRING_IS_INT: 
   // use (int)strtol(val.c_str(), NULL, 10); to convert it into conventional integer
   break;
   case STRING_IS_DOUBLE:
   // use atof(val.c_str()); to convert it into conventional float/double
   break;
}

숫자가 감지되지 않으면 함수가 0을 리턴한다는 것을 알 수 있습니다. 0은 부울처럼 거짓으로 취급 될 수 있습니다.


0

나는 간단한 협약을 제안한다.

ASCII 로의 변환이> 0이거나 0으로 시작하면 숫자입니다. 완벽하지는 않지만 빠릅니다.

이 같은:

string token0;

if (atoi(token0.c_str())>0 || isdigit(token0.c_str()[0]) ) { //this is a value
    // do what you need to do...
}

0

이 기능은 가능한 모든 경우를 처리합니다.

bool AppUtilities::checkStringIsNumber(std::string s){
    //Eliminate obvious irritants that could spoil the party
    //Handle special cases here, e.g. return true for "+", "-", "" if they are acceptable as numbers to you
    if (s == "" || s == "." || s == "+" || s == "-" || s == "+." || s == "-.") return false;

    //Remove leading / trailing spaces **IF** they are acceptable to you
    while (s.size() > 0 && s[0] == ' ') s = s.substr(1, s.size() - 1);
    while (s.size() > 0 && s[s.size() - 1] == ' ') s = s.substr(0, s.size() - 1);


    //Remove any leading + or - sign
    if (s[0] == '+' || s[0] == '-')
        s = s.substr(1, s.size() - 1);

    //Remove decimal points
    long prevLength = s.size();

    size_t start_pos = 0;
    while((start_pos = s.find(".", start_pos)) != std::string::npos) 
        s.replace(start_pos, 1, "");

    //If the string had more than 2 decimal points, return false.
    if (prevLength > s.size() + 1) return false;

    //Check that you are left with numbers only!!
    //Courtesy selected answer by Charles Salvia above
    std::string::const_iterator it = s.begin();
    while (it != s.end() && std::isdigit(*it)) ++it;
    return !s.empty() && it == s.end();

    //Tada....
}

0

sscanf의 리턴 코드를 사용하여 int인지 판별 할 수 있습니까?

bool is_number(const std::string& s)
{
    int value;
    int result = sscanf(valueStr.c_str(), "%d", &value);
    return (result != EOF && readResult != 0);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.