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

 
Ernst Van Der Merwe :
void OnStart ()
  {
//---
   ObjectCreate ( "SimultaneousReleaseIndex1" , OBJ_LABEL , 0 , 0 , 0 );
   ObjectSetString ( 0 , "SimultaneousReleaseIndex1" , OBJPROP_TEXT , "Four" );
   ObjectCreate ( "SimultaneousReleaseIndex2" , OBJ_LABEL , 0 , 0 , 0 );
   ObjectSetString ( 0 , "SimultaneousReleaseIndex2" , OBJPROP_TEXT , "44" );
   ObjectCreate ( "SimultaneousReleaseIndex3" , OBJ_LABEL , 0 , 0 , 0 );
   ObjectSetString ( 0 , "SimultaneousReleaseIndex3" , OBJPROP_TEXT , "Forty4" );
   ObjectCreate ( "SimultaneousReleaseIndex4" , OBJ_LABEL , 0 , 0 , 0 );
   ObjectSetString ( 0 , "SimultaneousReleaseIndex4" , OBJPROP_TEXT , ".1234567890" );
  
   if (IsNumeric( ObjectGetString ( 0 , "SimultaneousReleaseIndex1" , OBJPROP_TEXT )))
       Print ( "text1 is numeric" );
   if (IsNumeric( ObjectGetString ( 0 , "SimultaneousReleaseIndex2" , OBJPROP_TEXT )))
       Print ( "text2 is numeric" );
   if (IsNumeric( ObjectGetString ( 0 , "SimultaneousReleaseIndex3" , OBJPROP_TEXT )))
       Print ( "text3 is numeric" );
   if (IsNumeric( ObjectGetString ( 0 , "SimultaneousReleaseIndex4" , OBJPROP_TEXT )))
       Print ( "text4 is numeric" );
  }
//---
bool IsNumeric( string text)
  {
   int length= StringLen (text);
   for ( int i= 0 ;i<length;i++)
     {
       int char1= StringGetChar (text,i);
       if ((char1> 47 && char1< 58 ) || char1== 46 )
         continue ;
       else
         return ( false );
     }
   return ( true );
  }  
//+------------------------------------------------------------------+
예제 코드에 감사드립니다. 그러나 "IsNumeric" 키워드는 MQL4에 속하지 않는 것 같습니다. 내가 틀렸다면 저를 수정하십시오. 그러나 귀하의 코드는 매우 잘 실행되고 있으며 이것은 제가 찾던 것에 대한 완벽한 예입니다. 고맙습니다.
 
macpee : 하지만 "IsNumeric" 키워드가 MQL4에 속하지 않는 것 같습니다. 내가 틀렸다면 저를 수정하십시오.
키워드가 아니라 위에서 제공한 기능 입니다.
 
whroeder1 :
키워드가 아니라 위에서 제공한 기능 입니다.
오, 날 봐. 내가 알았어야 했다. @whroeder1 감사합니다.
 
macpee :
오, 날 봐. 내가 알았어야 했다. @whroeder1 감사합니다.
물론 마침표(.)는 마침표와 같은 것으로 간주되고 실제로는 0인 0(.0)과 같은 것으로 간주되므로 마침표(.)는 숫자여야 합니다. 이제 마침표(.....)의 수를 늘리려고 했으나 여전히 숫자로 인식하고 있습니다. 첫 번째 마침표가 인용된 후 추가 마침표(....)를 제거하기 위해 마침표(.) 코드가 필요합니다.
if ((char1> 47 && char1< 58 ) || char1== 46 )
그건 그렇고, 코드 목록을 찾을 수 없습니다 (ASCII, 추측).

또 다른 것은 음수를 입력하는 방법입니다. 코드는 항목 시작 부분에서만 부정 기호(-)를 캡처해야 합니다.

또한 코드를 완성하기 위해. (45-20)과 같이 숫자의 중간에도 부정기호(-)를 받아 뺄셈으로 처리하여 평가한 후 코드를 사용하여야 한다.
int char1= StringGetChar (text,i);
결과가 숫자인지 확인합니다. 네 가지 기본 이진 연산 모두에 대해 이 작업을 수행할 수 있습니다. 그러나 그것은 지금 우리에게 중요하지 않습니다.

전체 아이디어는 OBT_EDIT의 OBJPROP_TEXT 속성 이 경제 달력 데이터를 받아들이고 있는 그대로의 숫자로 처리하도록 만드는 것입니다. 이것이 IsNumeric의 내장 함수가 불필요하게 큰 코드를 작성하는 것을 피하기 위해 매우 중요한 이유입니다.
 
macpee :
물론 마침표(.)는 마침표와 같은 것으로 간주되고 실제로는 0인 0(.0)과 같은 것으로 간주되므로 마침표(.)는 숫자여야 합니다. 이제 마침표(.....)의 수를 늘리려고 했으나 여전히 숫자로 인식하고 있습니다. 첫 번째 마침표가 인용된 후 추가 마침표(....)를 제거하기 위해 마침표(.) 코드가 필요합니다.
if ((char1> 47 && char1< 58 ) || char1== 46 )
그건 그렇고, 코드 목록을 찾을 수 없습니다 (ASCII, 추측).

또 다른 것은 음수를 입력하는 방법입니다. 코드는 항목 시작 부분에서만 부정 기호(-)를 캡처해야 합니다.

또한 코드를 완성하기 위해. (45-20)과 같이 숫자의 중간에도 부정기호(-)를 받아 뺄셈으로 처리하여 평가한 후 코드를 사용하여야 한다.
int char1= StringGetChar (text,i);
결과가 숫자인지 확인합니다. 네 가지 기본 이진 연산 모두에 대해 이 작업을 수행할 수 있습니다. 그러나 그것은 지금 우리에게 중요하지 않습니다.

전체 아이디어는 OBT_EDIT의 OBJPROP_TEXT 속성 이 경제 달력 데이터를 받아들이고 있는 그대로의 숫자로 처리하도록 만드는 것입니다. 이것이 IsNumeric의 내장 함수가 불필요하게 큰 코드를 작성하는 것을 피하기 위해 매우 중요한 이유입니다.
또는 IsNumeric 검사 후 문자열을 double로 변환하는 것이 해결책일 수 있습니다.
 

macpee :
Of course a period (.) should be numeric since (.) is regarded as the same thing with a period and zero (.0) which is in fact zero (0). Now I tried increasing the number of period (.....) and it is still recognizing it as numeric. We need the code for period (.) so as to eliminate additional period (....) once the first period has been cited in

또 다른 것은 음수를 입력하는 방법입니다. 코드는 항목 시작 부분에서만 부정 기호(-)를 캡처해야 합니다.

여기에 에코가 있습니까?

정직한_knave :

네, 그런 것입니다.

다음 사항에 주의해야 합니다.

  • 여러 소수점(통과할 수 있지만 통과해서는 안 됨)
  • + 및 - 기호 사용(통과하지 않지만 통과해야 함)
  • 천 단위 구분 기호 또는 소수점으로 , 사용(통과하지 않지만 통과해야 함)
  • 다른 문자가 없는 단독 소수점(통과할 수 있지만 통과해서는 안 됨)
  • 출연진의 능력을 넘어선 숫자
  • 스페이스

________________________________

맥피 :

그건 그렇고, 코드 목록을 찾을 수 없습니다 (ASCII, 추측).

가자. 나는 당신이 검색 기술을 연마할 기회를 찾고 있다는 것을 알고 있습니다.

________________________________

맥피 :

전체 아이디어는 OBT_EDIT의 OBJPROP_TEXT 속성 이 경제 달력 데이터를 받아들이고 있는 그대로의 숫자로 처리하도록 만드는 것입니다. 이것이 IsNumeric의 내장 함수가 불필요하게 큰 코드를 작성하는 것을 피하기 위해 매우 중요한 이유입니다.

의도를 잘못 이해했을 수 있지만 사용자가 편집 상자에 날짜를 입력한 다음 날짜 시간으로 해석하기를 원하면(음수에 관심이 있는 경우가 아닐 수도 있음) 이것이 최선의 접근 방식인지 확신할 수 없습니다. 이유의 수.

 
honest_knave :

여기에 에코가 있습니까?

________________________________

가자. 나는 당신이 검색 기술을 연마할 기회를 찾고 있다는 것을 알고 있습니다.

________________________________

내가 당신의 의도를 잘못 이해했을 수도 있지만 사용자가 텍스트 상자에 날짜를 입력한 다음 날짜 시간으로 해석하기를 원하면(음수에 관심이 있는 경우가 아닐 수도 있음) 이것이 최선의 접근 방식인지 확신할 수 없습니다. 이유의 수.

실제로 문제의 경제 데이터에는 날짜가 포함되지 않고 '실제', '예상', '이전' 및 '수정' 데이터만 포함됩니다. 물론 B(십억), %(백분율) 등과 같은 기호도 입력하지 않습니다. 공백 없이 순수한 실수만 입력하면 됩니다. 아이디어는 내가 "동시 출시 지수"라고 부르는 것을 계산하는 것입니다. 동시에 발표된 일련의 경제 데이터를 결합하여 하나의 데이터로 보는 것을 의미합니다. 결합된 '실제'와 결합된 '예측' 등의 관계를 보기 위해 모든 '실제'를 하나의 '실제'로, 모든 '예측'을 하나의 '예측'으로 결합합니다.

 
macpee :
if ((char1> 47 && char1< 58 ) || char1== 46 )
그건 그렇고, 코드 목록을 찾을 수 없습니다 (ASCII, 추측).
숫자를 하드 코딩하지 마십시오. 코드를 자체 문서화하십시오.
if ((char1>= '0' && char1<= '9' ) || char1== '.' )
문자 상수 - 정수 유형 - 데이터 유형 - 언어 기본 - MQL4 참조
 
macpee :
실제로 문제의 경제 데이터에는 날짜가 포함되지 않고 '실제', '예상', '이전' 및 '수정' 데이터만 포함됩니다. 물론 B(십억), %(백분율) 등과 같은 기호도 입력하지 않습니다. 공백 없이 순수한 실수만 입력하면 됩니다. 아이디어는 내가 "동시 출시 지수"라고 부르는 것을 계산하는 것입니다. 동시에 발표된 일련의 경제 데이터를 결합하여 하나의 데이터로 보는 것을 의미합니다. 결합된 '실제'와 결합된 '예측' 등의 관계를 보기 위해 모든 '실제'를 하나의 '실제'로, 모든 '예측'을 하나의 '예측'으로 결합합니다.

그래서:

  • 참조로 문자열 전달
  • 공백을 제거
  • ','를 제거하십시오.
  • '+' 또는 '-'가 첫 번째 문자로만 나타나는지 확인하십시오.
  • 다른 모든 문자가 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를 반환하면 문자열을 숫자로 캐스팅할 수 있습니다.

당신은 컴플리케이션을 정말 좋아합니다. . 목표가 실수를 처리하는 것이라면 StringToDouble()을 사용 하고 특수한 경우 0을 처리하십시오.