Bir değişkenin içeriğinin sayısal olup olmadığını nasıl kontrol edebilirim? - sayfa 2

 

MathIsValidNumber() bir double kabul eder. Lütfen belgeleri kontrol edin .

Bir ip veriyorsun.

#property strict kullanımıyla ilgili yorumlarımı görmezden gelmeye devam etmeseydin, derleyicinin seni bu konuda uyardığını görürdün.

Bir harf dizisini alıp bir double yaparsanız, double'ın değeri 0 olur .

0 geçerli bir sayıdır.

Bu nedenle kodunuz neden doğru dönüyor.

 
honest_knave :

MathIsValidNumber() bir double kabul eder. Lütfen belgeleri kontrol edin.

Bir ip veriyorsun.

#property strict kullanımıyla ilgili yorumlarımı görmezden gelmeye devam etmeseydin, derleyicinin seni bu konuda uyardığını görürdün.

Bir harf dizisini alıp bir double yaparsanız, double'ın değeri 0 olur .

0 geçerli bir sayıdır.

Bu nedenle kodunuz neden doğru dönüyor.

Ama cevabında bana MathIsValidNumber()'ın stringleri değil, sadece double'ı karşılaştırdığını söylemedin. Bu arada, hangi numara geçerli bir numara değil? Karmaşık sayılar veya sonsuzluklar ve bu arada bunları MQL4'te kullanmak isteyenler hariç. Her neyse, "Anahtar Kelime" yanıltıcı görünüyor.
 
macpee :
Ama cevabında bana MathIsValidNumber()'ın stringleri değil, sadece double'ı karşılaştırdığını söylemedin. Bu arada, hangi numara geçerli bir numara değil? Karmaşık sayılar veya sonsuzluklar ve bu arada bunları MQL4'te kullanmak isteyenler hariç. Her neyse, "Anahtar Kelime" yanıltıcı görünüyor.
Şimdi tekrar soruyorum, derleyiciye bir değişkenin herhangi bir sayı biçimi değil de bir dizge olup olmadığına karar vermesini söyleyen komut nedir? Beklenen cevabınız için teşekkür ederim. Visual basic'de "İsnumeric" gibi bir anahtar kelimeyi hatırlıyorum.
 
macpee :
Ama cevabında bana MathIsValidNumber()'ın stringleri değil, sadece double'ı karşılaştırdığını söylemedin.

Belgeleri kontrol etme zahmetine girmiş olabileceğini düşündüm...

Ve eğer #mülkiyet konusunda katı tavsiyemi görmezden gelmeseydin...

macpee :
Şimdi tekrar soruyorum, derleyiciye bir değişkenin herhangi bir sayı biçimi değil de bir dize tuttuğuna karar vermesini söyleyen komut nedir? Beklenen cevabınız için teşekkür ederim.

Değerin hiç 0 olmasını beklemiyorsanız, dizeyi bir çifte yazın ve 0'a eşit olmadığını test edin.

 
honest_knave :

Belgeleri kontrol etme zahmetine girmiş olabileceğini düşündüm...

Ve eğer #mülkiyet konusunda katı tavsiyemi görmezden gelmeseydin...

Değerin hiç 0 olmasını beklemiyorsanız, dizeyi bir çifte yazın ve 0'a eşit olmadığını test edin.

İyi cevap. Şimdi deneyebilirim. Ama sıfır sayısına ne olur? Bunun tamsayı değerinin yanı sıra çifte bir değer olduğunu varsayıyorum. Dize yayınladığınızda 0, 0 girdiğinizde 0 döndürür. Yani...?
 
macpee :
Ama sıfır sayısına ne olur? Bunun tamsayı değerinin yanı sıra çifte bir değer olduğunu varsayıyorum. Dize yayınladığınızda 0, 0 girdiğinizde 0 döndürür. Yani...?

Evet, bu bir problem.

Döküm değeri = 0 ise bir dizi karşılaştırması yapabilirsiniz.

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

Ancak girilen 0.0 veya 0.00 hakkında düşünmeniz gerekir.

Dizeyi bir karakter dizisine ayırabilir ve her karakteri test edebilirsiniz.

Bunun ne kadar önemli olduğuna bağlı.

 
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 );
  }  
//+------------------------------------------------------------------+
dürüst_knave :

Evet, bu bir problem.

Döküm değeri = 0 ise bir dizi karşılaştırması yapabilirsiniz.

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

Ancak 0.0 veya 0.00 girildiğini düşünmeniz gerekir.

Dizeyi bir karakter dizisine ayırabilir ve her karakteri test edebilirsiniz.

Bunun ne kadar önemli olduğuna bağlı.

Evet, öyle bir şey.

Şu konularda dikkatli olmanız gerekir:

  • Birden çok ondalık nokta (geçerdi ama geçmemeli)
  • + ve - sembollerinin kullanımı (geçemez ama gerekir)
  • binlik ayırıcı veya ondalık nokta olarak kullanımı (geçemez, ancak gerekir)
  • Başka karakter içermeyen tek bir ondalık nokta (geçer, ancak geçmemelidir)
  • Oyuncu kadrosunun kapasitesini aşan sayılar
 
honest_knave :

Evet, öyle bir şey.

Şu konularda dikkatli olmanız gerekir:

  • Birden çok ondalık nokta (geçerdi ama geçmemeli)
  • + ve - sembollerinin kullanımı (geçemez ama gerekir)
  • binlik ayırıcı veya ondalık nokta olarak kullanımı (geçemez, ancak gerekir)
  • Başka karakter içermeyen tek bir ondalık nokta (geçer, ancak geçmemelidir)
  • Oyuncu kadrosunun kapasitesini aşan sayılar
  • boşluklar
 

Ernst Van Der Merwe :

  • boşluklar

Evet, iyi nokta!
Neden: