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

 
Alain Verleyen :
Komplikasyonu gerçekten seviyorsun. Amaç yalnızca gerçek sayıları işlemekse, StringToDouble() ve özel durum 0'ın işlenmesini kullanın.

İlk çözüm buydu:

dürüst_knave :

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

Bununla birlikte, OP, girilen değerin 0 olup olmadığını veya dizenin geçersiz bir sayı olmasının sonucu olarak 0 olup olmadığını ayırt etmek istedi. Hem "0" hem de "sfdlgkjsflkjdsklfsd", StringToDouble() veya (double) ile 0 ile sonuçlanacaktır.

Bu, daha sonra bu tartışmayı doğuran OP için kabul edilemezdi.

 
honest_knave :

İlk çözüm buydu:

Bununla birlikte, OP, girilen değerin 0 olup olmadığını veya dizenin geçersiz bir sayı olmasının sonucu olarak 0 olup olmadığını ayırt etmek istedi. Hem "0" hem de "sfdlgkjsflkjdsklfsd", StringToDouble() veya (double) ile 0 ile sonuçlanacaktır.

Bu, daha sonra bu tartışmayı doğuran OP için kabul edilemezdi.

Bu yüzden "ve özel durum 0'ın işlenmesi" dedim.

Basitleştirilmiş örnek:
   double value =StringToDouble(inputs);
   if ( value == 0 )
     {
       if (inputs== "0" || inputs== "0.0" )
        {
         //--- all is ok                
        }
       else
        {
         //--- wrong inputs
        }
     }
 
Alain Verleyen :
Bu yüzden "ve özel durum 0'ın işlenmesi" dedim.

Basitleştirilmiş örnek:
   double value =StringToDouble(inputs);
   if ( value == 0 )
     {
       if (inputs== "0" || inputs== "0.0" )
        {
         //--- all is ok                
        }
       else
        {
         //--- wrong inputs
        }
     }

Peki ya 0.00?

Veya +0,00?

Veya .0?


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 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ı.

 
honest_knave :

Peki ya 0.00?

Veya +0,00?

Veya .0?


Bu yüzden "Basitleştirilmiş örnek" dedim. OP için işi yapmayacağım.

 
Alain Verleyen :
Bu yüzden "Basitleştirilmiş örnek" dedim. OP için işi yapmayacağım.

Yine de ilginç bir alıştırma, yani olası "0" varyasyonlarının bir listesine sahip olmak mı yoksa sadece her şeyi test etmek mi daha iyi?

İlki tartışmasız daha hızlıdır, ancak meşru bir varyasyonu kaçırma riski altındadır.

Ancak, yalnızca bir CHARTEVENT_OBJECT_ENDEDIT üzerinde test edilmesi gerektiğinde hız ne kadar önemlidir ?

Ne olursa olsun, OP'nin devam edecek çok şeyi olduğundan eminim!

 
honest_knave :

Yine de ilginç bir alıştırma, yani olası "0" varyasyonlarının bir listesine sahip olmak mı yoksa sadece her şeyi test etmek mi daha iyi?

İlki tartışmalı olarak daha hızlıdır, ancak meşru bir varyasyonu kaçırma riski altındadır.

Ancak, yalnızca bir CHARTEVENT_OBJECT_ENDEDIT üzerinde test edilmesi gerektiğinde hız ne kadar önemlidir?

Ne olursa olsun, OP'nin devam edecek çok şeyi olduğundan eminim!

Sıfırı "0" olarak girmeyi ve diğer tüm durumları reddetmeyi de isteyebilirsiniz.

Veya normal ifade kullanarak :-D
 
Alain Verleyen :
Ayrıca "0" olarak sıfır girmeyi isteyebilir ve diğer tüm durumları reddedebilirsiniz.

Veya normal ifade kullanarak :-D

Şahsen, şöyle bir yaklaşım benimsiyordum:

ENDEDIT gerçekleştiğinde, OBJ_TEXT'i bir çifte dönüştürün ve ardından onu bir dizge olarak düzenleme kutusuna geri itin (biçimi kontrol etmek istersem StringFormat() kullanarak). Kullanıcı, eylemlerinin sonucunu hemen görecek ve ihtiyaçlarına uygun değilse değiştirecek veya bırakacaktır.

Örneğin

#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 :

Şahsen, şöyle bir yaklaşım benimsiyordum:

ENDEDIT gerçekleştiğinde, OBJ_TEXT'i bir çifte dönüştürün ve ardından onu bir dizge olarak düzenleme kutusuna geri itin (biçimi kontrol etmek istersem StringFormat() kullanarak). Kullanıcı, eylemlerinin sonucunu hemen görecek ve ihtiyaçlarına uygun değilse değiştirecek veya bırakacaktır.

Örneğin

#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);
     }
  }

Girişinizi doğrulamak için bir yola ihtiyacınız olacak. (ek bir düğme?)

Basit tutun. neyse sen nasıl istersen :p

 
Alain Verleyen :

Girişinizi doğrulamak için bir yola ihtiyacınız olacak. (ek bir düğme?)

Takip ettiğimden emin değilim...?

OP'nin amacını yanlış anlamış olabilirim, ancak arayüzün dinamik olacağına inanıyorum, yani bu düzenleme kutusundaki bir değişiklik, buna göre başka bir kutunun güncellenmesine neden olacaktır.

Bir doğrulama düğmeniz olabilir, ancak sonuç basitçe görüntüleniyorsa (işlemden ziyade) gereksiz bir ekleme olabilir. Ama emin değilim - OP'nin açıklığa kavuşturması gerekecek.

Alain Verleyen :

Basit tutun. neyse sen nasıl istersen :p

İşleri basit tutmak konusunda çok katılıyorum. Bundan daha basit mi oluyor?

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

Not İstediğim gibi olduğundan emin değilim, bu benim için sadece akademik bir tartışma - buna ihtiyacım yok!

 
honest_knave :

Takip ettiğimden emin değilim...?

...
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.
Neden: