변수의 내용이 숫자인지 어떻게 확인합니까? - 페이지 5

 
Alain Verleyen :
솔직히 나는 OP의 의도에 대해 전혀 모른다
일반적인 요청으로 받아들인다면 "변수의 내용이 숫자인지 확인하는 방법?", 가장 우아한 솔루션은 정규식을 사용하는 것입니다.
 
구글은 당신의 친구입니다! 다음은 C 및 C++(MQL은 제외)를 비롯한 여러 언어로 된 "IsNumeric" 구현에 대한 링크입니다.

그리고 여기에 더 완전한 것처럼 보이는 또 다른 것이 있습니다(페이지 맨 끝에 있음).

Determine if a string is numeric - Rosetta Code
Determine if a string is numeric - Rosetta Code
  • rosettacode.org
Create a boolean function which takes in a string and tells whether it is a numeric string (floating point and negative numbers included) in the syntax the language uses for numeric literals or numbers converted from strings. The first file is the package interface containing the declaration of the Is_Numeric function. The second file is the...
 
Alain Verleyen :
솔직히 나는 OP의 의도에 대해 전혀 모른다
일반적인 요청으로 받아들인다면 "변수의 내용이 숫자인지 확인하는 방법?", 가장 우아한 솔루션은 정규식을 사용하는 것입니다.
내 의도는 당신이 추측하는 일반적인 요청입니다. 숫자가 숫자이면 숫자이며 숫자의 특성에서 발생하는 어떤 형태의 오류도 없이 합리적인 계산에 사용할 수 있습니다. 정규 표현식 과 관련된 MQL4의 예제 코드를 제시하십시오.
 
예, OP는 지금 여기에 있으며 그는 지금까지 제안된 모든 솔루션과 대응 솔루션을 듣고 봅니다. 댓글 달아주신 모든 분들의 노고에 감사드립니다. 나는 정직한_knave가 제시한 예제 코드를 좋아한다. 첫째, 그는 자신의 의견을 코드로 뒷받침해 왔습니다. 둘째, 그는 자신의 예제에서 하드 코딩하지 않았습니다. 또한 그의 코드는 0(0, 0.0, 0.00, .0 등)의 모든 형태를 쉽게 처리했으며 쉽게 이해할 수 있습니다. 어쨌든 StringToDouble()을 사용하는 것이 더 낫다고 생각하지 않습니다.

모든 @ whroeder1, 정직한_knave, Ernst Van Der Merwe, Alain Verleyen 및 Fernando Carreiro에게 감사합니다.
 
honest_knave :

그래서:

  • 참조로 문자열 전달
  • 공백을 제거
  • ','를 제거하십시오.
  • 하나의 '.'만 있는지 확인하십시오.
  • '+' 또는 '-'가 첫 번째 문자로만 나타나는지 확인하십시오.
  • 다른 모든 문자가 0에서 9 사이의 숫자인지 확인하십시오.

bool IsValidNumber( string &text)
  {
   StringReplace (text, " " , NULL );
   StringReplace (text, "," , NULL );
   int point_cnt = 0 ;
   for ( int i= StringLen (text)- 1 ; i>= 0 ; i--)
     {
       int this_char = StringGetChar (text,i);
       if (this_char == '.' )
        {
         point_cnt++;
         if (point_cnt> 1 )       return ( false );
         if ( StringLen (text)< 2 ) return ( false );
        }
       else if (this_char == '+' || this_char == '-' )
        {
         if (i> 0 ) return ( false );
        }
       else if (this_char < '0' || this_char > '9' ) return ( false );
     }
   return ( true );
  }

true를 반환하면 문자열을 숫자로 캐스팅할 수 있습니다.

하지만 확인 해야 할 사항이 몇 가지 더 있습니다. 첫 번째 문자로 '+' 또는 '-'가 나타나는지 확인해야 하지만 단독으로 표시되지 않는지도 확인해야 합니다.
 
honest_knave :

그래서:

  • 참조로 문자열 전달
  • 공백을 제거
  • ','를 제거하십시오.
  • 하나의 '.'만 있는지 확인하십시오.
  • '+' 또는 '-'가 첫 번째 문자로만 나타나는지 확인하십시오.
  • 다른 모든 문자가 0에서 9 사이의 숫자인지 확인하십시오.

bool IsValidNumber( string &text)
  {
   StringReplace (text, " " , NULL );
   StringReplace (text, "," , NULL );
   int point_cnt = 0 ;
   for ( int i= StringLen (text)- 1 ; i>= 0 ; i--)
     {
       int this_char = StringGetChar (text,i);
       if (this_char == '.' )
        {
         point_cnt++;
         if (point_cnt> 1 )       return ( false );
         if ( StringLen (text)< 2 ) return ( false );
        }
       else if (this_char == '+' || this_char == '-' )
        {
         if (i> 0 ) return ( false );
        }
       else if (this_char < '0' || this_char > '9' ) return ( false );
     }
   return ( true );
  }

true를 반환하면 문자열을 숫자로 캐스팅할 수 있습니다.

코드(상자 안의 코드)를 추가/수정하여 문제(독립형 '+' 또는 '-')를 해결한 것 같습니다. 아래 이미지를 참조하십시오.