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

 
Alain Verleyen :
Dürüst olmak gerekirse, OP'nin niyeti hakkında hiçbir fikrim yok
Bunu genel bir istek olarak alırsak: "Bir değişkenin içeriğinin sayısal olup olmadığı nasıl kontrol edilir?", en şık çözüm düzenli ifade kullanmaktır.
 
Google Senin Arkadaşın! İşte C ve C++ dahil birçok dilde "IsNumeric" uygulaması için bir bağlantı (ancak MQL yok).

Ve burada daha eksiksiz görünen bir tane daha var (sayfanın en sonunda):

Determine if a string is numeric - Rosetta Code
Determine if a string is numeric - Rosetta Code
  • rosettacode.org
Create a boolean function which takes in a string and tells whether it is a numeric string (floating point and negative numbers included) in the syntax the language uses for numeric literals or numbers converted from strings. The first file is the package interface containing the declaration of the Is_Numeric function. The second file is the...
 
Alain Verleyen :
Dürüst olmak gerekirse, OP'nin niyeti hakkında hiçbir fikrim yok
Bunu genel bir istek olarak alırsak: "Bir değişkenin içeriğinin sayısal olup olmadığı nasıl kontrol edilir?", en şık çözüm düzenli ifade kullanmaktır.
Niyetim, varsaydığınız genel istektir - eğer bir sayı sayısal ise, o zaman sayısaldır ve sayıların doğasından kaynaklanan herhangi bir hata olmaksızın makul bir hesaplama için kullanılabilir. MQL4'te normal ifadeyle ilgili bir örnek kod sunun.
 
Evet OP şimdi burada ve şimdiye kadar sunulan tüm çözümleri ve karşı çözümleri duyuyor ve görüyor. Yorum yapan herkesin çabasını takdir ediyorum. dürüst_knave tarafından sunulan örnek kodları beğendim. İlk olarak, yorumlarını baştan beri kodlarla destekliyor. İkincisi, örneklerinden hiçbirinde sabit kodlama yapmamıştır. Ayrıca, kodları herhangi bir sıfır (0, 0.0, 0.00, .0, vb.) biçimini kolayca halleder ve kolayca anlaşılır. Zaten StringToDouble() kullanımının daha iyi olduğunu düşünmüyorum.

Hepinize @ whroeder1, dürüst_knave, Ernst Van Der Merwe, Alain Verleyen ve Fernando Carreiro'ya teşekkürler.
 
honest_knave :

Böyle:

  • Dizeyi referansa göre iletin
  • Boş alanları ayıklayın
  • ',' işaretini çıkarın
  • Yalnızca bir '.' olup olmadığını kontrol edin.
  • '+' veya '-' yalnızca ilk karakter olarak göründüğünü kontrol edin
  • Diğer her karakterin 0 ile 9 arasında bir sayı olduğunu kontrol edin

Örneğin

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 döndürürse, dizeyi bir sayı olarak yayınlayabilirsiniz.

Ama kontrol etmemiz gereken birkaç şey daha var. İlk karakter olarak '+' veya '-' göründüğünü kontrol etmemiz gerekirken, yalnız olmadığını da kontrol etmemiz gerekiyor.
 
honest_knave :

Böyle:

  • Dizeyi referansa göre iletin
  • Boş alanları ayıklayın
  • ',' işaretini çıkarın
  • Yalnızca bir '.' olup olmadığını kontrol edin.
  • '+' veya '-' yalnızca ilk karakter olarak göründüğünü kontrol edin
  • Diğer her karakterin 0 ile 9 arasında bir sayı olduğunu kontrol edin

Örneğin

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 döndürürse, dizeyi bir sayı olarak yayınlayabilirsiniz.

Kodu (kutulardaki kodlar) ekleyerek/değiştirerek sorunu çözmüş gibiyim (tek başına '+' veya '-'). Aşağıdaki resme bakın.