변수의 내용이 숫자인지 어떻게 확인합니까? - 페이지 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 :

  • 스페이스

예, 좋은 지적입니다!