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

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

이것이 초기 솔루션이었습니다.

정직한_knave :

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

그러나 OP는 0이 입력된 값인지 또는 0이 잘못된 숫자인 문자열의 결과인지 구별하는 작업을 할 수 있기를 원했습니다. "0"과 "sfdlgkjsflkjdsklfsd"는 모두 StringToDouble() 또는 (double)을 사용하여 0이 됩니다.

이것은 이후의 논의를 촉발시킨 OP에서 용납할 수 없었습니다.

 
honest_knave :

이것이 초기 솔루션이었습니다.

그러나 OP는 0이 입력된 값인지 또는 0이 잘못된 숫자인 문자열의 결과인지 구별하는 작업을 할 수 있기를 원했습니다. "0"과 "sfdlgkjsflkjdsklfsd"는 모두 StringToDouble() 또는 (double)을 사용하여 0이 됩니다.

이것은 이후의 논의를 촉발시킨 OP에서 용납할 수 없었습니다.

그래서 제가 "특수 케이스 0의 처리"라고 말한 것입니다.

단순화된 예:
   double value =StringToDouble(inputs);
   if ( value == 0 )
     {
       if (inputs== "0" || inputs== "0.0" )
        {
         //--- all is ok                
        }
       else
        {
         //--- wrong inputs
        }
     }
 
Alain Verleyen :
그래서 제가 "특수 케이스 0의 처리"라고 말한 것입니다.

단순화된 예:
   double value =StringToDouble(inputs);
   if ( value == 0 )
     {
       if (inputs== "0" || inputs== "0.0" )
        {
         //--- all is ok                
        }
       else
        {
         //--- wrong inputs
        }
     }

그리고 0.00은 어떻습니까?

또는 +0.00?

아니면 .0?


정직한_knave :

네, 문제입니다.

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

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

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

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

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

 
honest_knave :

그리고 0.00은 어떻습니까?

또는 +0.00?

아니면 .0?


그래서 내가 "단순한 예"라고 말한 것입니다. 나는 OP를 위해 일하지 않을 것이다.

 
Alain Verleyen :
그래서 내가 "단순한 예"라고 말한 것입니다. 나는 OP를 위해 일하지 않을 것이다.

흥미로운 연습입니다. 그럼에도 불구하고 "0"의 가능한 변형 목록을 갖는 것이 더 낫습니까, 아니면 그냥 모든 것을 테스트하는 것이 더 낫습니까?

전자는 틀림없이 빠르지만 합법적인 변형을 놓칠 위험이 있습니다.

그러나 CHARTEVENT_OBJECT_ENDEDIT 에서만 테스트해야 하는 경우 속도가 얼마나 중요 합니까?

그럼에도 불구하고, OP는 이제 계속할 일이 많다고 확신합니다!

 
honest_knave :

흥미로운 연습입니다. 그럼에도 불구하고 "0"의 가능한 변형 목록을 갖는 것이 더 낫습니까, 아니면 그냥 모든 것을 테스트하는 것이 더 낫습니까?

전자는 틀림없이 빠르지만 합법적인 변형을 놓칠 위험이 있습니다.

그러나 CHARTEVENT_OBJECT_ENDEDIT 에서만 테스트해야 하는 경우 속도가 얼마나 중요합니까?

그럼에도 불구하고, OP는 이제 계속할 일이 많다고 확신합니다!

0을 "0"으로 입력하고 다른 모든 경우를 거부하도록 요청할 수도 있습니다.

또는 정규식 사용 :-D
 
Alain Verleyen :
0을 "0"으로 입력하고 다른 모든 경우를 거부하도록 요청할 수도 있습니다.

또는 정규식 사용 :-D

개인적으로 다음과 같은 접근 방식을 취하고 있습니다.

ENDEDIT가 발생하면 OBJ_TEXT 를 double로 변환한 다음 편집 상자에 문자열로 다시 푸시합니다(형식을 제어 하려면 StringFormat() 사용). 사용자는 즉시 자신의 작업 결과를 보고 필요에 맞지 않으면 변경하거나 그대로 둡니다.

#property strict

#define EDIT_BOX "EditBox"

int OnInit ()
  {
   ObjectCreate     ( 0 , EDIT_BOX,  OBJ_EDIT000 );
   ObjectSetInteger ( 0 , EDIT_BOX,  OBJPROP_XDISTANCE200 );
   ObjectSetInteger ( 0 , EDIT_BOX,  OBJPROP_YDISTANCE200 );
   ObjectSetInteger ( 0 , EDIT_BOX,  OBJPROP_XSIZE100 );
   ObjectSetInteger ( 0 , EDIT_BOX,  OBJPROP_YSIZE ,   20 );
   ObjectSetInteger ( 0 , EDIT_BOX,  OBJPROP_ALIGNALIGN_CENTER );
   ObjectSetString  ( 0 , EDIT_BOX,  OBJPROP_TEXT"Enter Value" );
   return ( INIT_SUCCEEDED );
  }

void OnDeinit ( const int reason)
  {
   ObjectDelete ( 0 , EDIT_BOX);
  }

void OnChartEvent ( const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   if (id== CHARTEVENT_OBJECT_ENDEDIT && sparam==EDIT_BOX)
     {
       double value = ( double ) ObjectGetString ( 0 , EDIT_BOX,  OBJPROP_TEXT );
       ObjectSetString ( 0 , EDIT_BOX,  OBJPROP_TEXT , ( string )value);
     }
  }
 
honest_knave :

개인적으로 다음과 같은 접근 방식을 취하고 있습니다.

ENDEDIT가 발생하면 OBJ_TEXT 를 double로 변환한 다음 편집 상자에 문자열로 다시 푸시합니다(형식을 제어하려면 StringFormat() 사용). 사용자는 즉시 자신의 작업 결과를 보고 필요에 맞지 않으면 변경하거나 그대로 둡니다.

#property strict

#define EDIT_BOX "EditBox"

int OnInit ()
  {
   ObjectCreate     ( 0 , EDIT_BOX,  OBJ_EDIT000 );
   ObjectSetInteger ( 0 , EDIT_BOX,  OBJPROP_XDISTANCE200 );
   ObjectSetInteger ( 0 , EDIT_BOX,  OBJPROP_YDISTANCE200 );
   ObjectSetInteger ( 0 , EDIT_BOX,  OBJPROP_XSIZE100 );
   ObjectSetInteger ( 0 , EDIT_BOX,  OBJPROP_YSIZE ,   20 );
   ObjectSetInteger ( 0 , EDIT_BOX,  OBJPROP_ALIGNALIGN_CENTER );
   ObjectSetString  ( 0 , EDIT_BOX,  OBJPROP_TEXT"Enter Value" );
   return ( INIT_SUCCEEDED );
  }

void OnDeinit ( const int reason)
  {
   ObjectDelete ( 0 , EDIT_BOX);
  }

void OnChartEvent ( const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   if (id== CHARTEVENT_OBJECT_ENDEDIT && sparam==EDIT_BOX)
     {
       double value = ( double ) ObjectGetString ( 0 , EDIT_BOX,  OBJPROP_TEXT );
       ObjectSetString ( 0 , EDIT_BOX,  OBJPROP_TEXT , ( string )value);
     }
  }

입력을 검증할 방법이 필요합니다. (추가 버튼?)

간단하게 유지하세요. 어쨌든, 당신이 원하는대로 :p

 
Alain Verleyen :

입력을 검증할 방법이 필요합니다. (추가 버튼?)

팔로우 안하고...?

OP의 의도를 잘못 이해했을 수도 있지만 인터페이스가 동적일 것이라고 생각합니다. 즉, 이 편집 상자를 변경하면 그에 따라 다른 상자가 업데이트됩니다.

유효성 검사 버튼이 있을 수 있지만 결과가 단순히 표시되는 경우(작업이 아니라) 불필요한 추가일 수 있습니다. 그러나 확실하지 않습니다. OP는 명확히해야합니다.

알랭 벌리앙 :

간단하게 유지하세요. 어쨌든 원하는대로 :p

나는 일을 단순하게 유지하는 것에 매우 동의합니다. 이보다 더 간단해지나요?

       double value = ( double ) ObjectGetString ( 0 , EDIT_BOX, OBJPROP_TEXT );
       ObjectSetString ( 0 , EDIT_BOX, OBJPROP_TEXT , ( string )value);

추신: 제가 원하는 대로 될지는 모르겠지만 저를 위한 학술적 토론일 뿐입니다. 필요 없습니다!

 
honest_knave :

팔로우 안하고...?

...
솔직히 나는 OP의 의도에 대해 전혀 모른다
일반적인 요청으로 받아들인다면 "변수의 내용이 숫자인지 확인 하는 방법?", 가장 우아한 솔루션은 정규식을 사용하는 것입니다.