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

 

MathIsValidNumber()는 double 을 허용합니다. 문서를 확인 하십시오.

당신은 그것에게 문자열 을주고 있습니다.

#property strict 사용에 대한 내 의견을 계속 무시하지 않으면 컴파일러에서 이에 대해 경고하는 것을 볼 수 있습니다.

문자열을 가져와서 double로 만들면 double의 값은 0이 됩니다.

0은 유효한 숫자입니다.

따라서 코드가 true를 반환하는 이유입니다.

 
honest_knave :

MathIsValidNumber()는 double 을 허용합니다. 문서를 확인하십시오.

당신은 그것에게 문자열 을주고 있습니다.

#property strict 사용에 대한 내 의견을 계속 무시하지 않으면 컴파일러에서 이에 대해 경고하는 것을 볼 수 있습니다.

문자열을 가져와서 double로 만들면 double의 값은 0이 됩니다.

0은 유효한 숫자입니다.

따라서 코드가 true를 반환하는 이유입니다.

그러나 MathIsValidNumber()가 문자열이 아닌 배만 비교한다는 답변을 말하지 않았습니다. 그런데 어떤 숫자가 유효하지 않은 숫자입니까? 복소수 또는 무한대를 제외하고 누가 MQL4에서 사용하고 싶은지. 어쨌든 "키워드"는 오해의 소지가 있는 것 같습니다.
 
macpee :
그러나 MathIsValidNumber()가 문자열이 아닌 배만 비교한다는 답변을 말하지 않았습니다. 그런데 어떤 숫자가 유효하지 않은 숫자입니까? 복소수 또는 무한대를 제외하고 누가 MQL4에서 사용하고 싶은지. 어쨌든 "키워드"는 오해의 소지가 있는 것 같습니다.
그래서 이제 다시 묻습니다. 변수가 숫자 형식이 아닌 문자열을 포함하는지 여부를 결정하도록 컴파일러에 지시하는 명령은 무엇입니까? 예상한 답변 감사합니다. Visual Basic에서 "Isnumeric"과 같은 키워드를 기억합니다.
 
macpee :
그러나 MathIsValidNumber()가 문자열이 아닌 배만 비교한다는 답변을 말하지 않았습니다.

문서 확인 을 귀찮게 하셨을 거라 생각합니다...

그리고 #property strict에 대한 내 조언을 계속 무시하지 않았다면...

맥피 :
그래서 이제 다시 묻습니다. 변수가 숫자 형식이 아니라 문자열을 포함하는지 결정하도록 컴파일러에 지시하는 명령은 무엇입니까? 예상한 답변 감사합니다.

값이 0이 될 것으로 예상하지 않으면 문자열을 double로 유형 캐스트하고 0이 아닌지 테스트합니다.

 
honest_knave :

문서 확인을 귀찮게 하셨을 거라 생각합니다...

그리고 #property strict에 대한 내 조언을 계속 무시하지 않았다면...

값이 0이 아닐 것으로 예상되는 경우 문자열을 double로 유형 캐스트하고 0이 아닌지 테스트합니다.

좋은 답변입니다. 이제 시도해 볼 수 있습니다. 그러나 숫자 0은 어떻게 됩니까? 나는 그것이 정수 값뿐만 아니라 이중 값이라고 가정합니다. 문자열을 캐스팅하면 0이 반환되고 0을 입력하면 0이 반환됩니다. 그래서...?
 
macpee :
그러나 숫자 0은 어떻게 됩니까? 나는 그것이 정수 값뿐만 아니라 이중 값이라고 가정합니다. 문자열을 캐스팅하면 0이 반환되고 0을 입력하면 0이 반환됩니다. 그래서...?

네, 문제입니다.

캐스트 값 = 0인 경우 문자열 비교를 수행할 수 있습니다.

즉 if(cast_value == 0 && str_value == "0")

그러나 0.0 또는 0.00이 입력되는 것에 대해 생각해야 합니다.

문자열을 문자 배열로 버스트하고 각 문자를 테스트할 수 있습니다.

이것이 얼마나 중요한지 에 달려 있습니다.

 
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);
  }  
//+------------------------------------------------------------------+
 
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 );
  }  
//+------------------------------------------------------------------+
정직한_knave :

네, 문제입니다.

캐스트 값 = 0인 경우 문자열 비교를 수행할 수 있습니다.

즉 if(cast_value == 0 && str_value == "0")

그러나 0.0 또는 0.00이 입력되는 것에 대해 생각해야 합니다.

문자열을 문자 배열로 버스트하고 각 문자를 테스트할 수 있습니다.

이것이 얼마나 중요한지에 달려 있습니다.

네, 그런 것입니다.

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

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

네, 그런 것입니다.

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

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

Ernst Van Der Merwe :

  • 스페이스

예, 좋은 지적입니다!