![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Vi piace molto la complicazione. Se l'obiettivo è solo quello di elaborare numeri reali, usate StringToDouble() e un'elaborazione del caso speciale 0.
Questa era la soluzione iniziale:
Se non vi aspettate che il valore sia mai 0, fate il type-cast della stringa in un doppio e verificate che non sia uguale a 0.
Tuttavia, l'OP voleva essere in grado di distinguere se 0 era il valore inserito, o se 0 era il risultato della stringa che era un numero non valido. Sia "0" che "sfdlgkjsflkjdsklfsd" risulteranno 0 con StringToDouble() o (double).
Questo era inaccettabile per l'OP che poi ha generato questa discussione successiva.
Questa era la soluzione iniziale:
Tuttavia, l'OP voleva essere in grado di distinguere se 0 era il valore inserito, o se 0 era il risultato della stringa che era un numero non valido. Sia "0" che "sfdlgkjsflkjdsklfsd" danno come risultato 0 con StringToDouble() o (double).
Questo era inaccettabile per l'OP che ha poi generato questa successiva discussione.
Esempio semplificato:
if(value==0)
{
if(inputs=="0" || inputs=="0.0")
{
//--- all is ok
}
else
{
//--- wrong inputs
}
}
Ecco perché ho detto "e un'elaborazione del caso speciale 0".
Esempio semplificato:
if(value==0)
{
if(inputs=="0" || inputs=="0.0")
{
//--- all is ok
}
else
{
//--- wrong inputs
}
}
E che dire di 0,00?
O +0.00?
O .0?
Sì, questo è un problema.
Potresti fare un confronto di stringhe se il valore cast = 0
cioè if(cast_value == 0 && str_value == "0")
Ma dovreste pensare all'inserimento di 0,0 o 0,00.
Potresti scoppiare la stringa in un array di caratteri e testare ogni carattere.
Dipende da quanto è importante.
E che dire di 0,00?
O +0.00?
O .0?
Ecco perché ho detto "esempio semplificato". Non farò il lavoro per l'OP.
È un esercizio interessante, tuttavia: è meglio avere una lista di possibili variazioni di "0", o semplicemente testare tutto?
Il primo è probabilmente più veloce, ma con il rischio di perdere una variazione legittima.
Tuttavia, quanto è importante la velocità quando dovrebbe essere testato solo su unCHARTEVENT_OBJECT_ENDEDIT?
Indipendentemente da ciò, sono sicuro che l'OP ora ha molto da fare!
È un esercizio interessante, tuttavia: è meglio avere una lista di possibili variazioni di "0", o semplicemente testare tutto?
Il primo è probabilmente più veloce, ma con il rischio di perdere una variazione legittima.
Tuttavia, quanto è importante la velocità quando dovrebbe essere testato solo su unCHARTEVENT_OBJECT_ENDEDIT?
Indipendentemente da ciò, sono sicuro che l'OP ora ha molto da fare!
O usando un'espressione regolare:-D
Si potrebbe anche chiedere di inserire zero come "0" e rifiutare tutti gli altri casi.
O usando un'espressione regolare :-D
Personalmente, adotterei un approccio come questo:
Una volta che ENDEDIT accade, cast l'OBJ_TEXT in un doppio e poi spingerlo di nuovo nella casella di modifica come una stringa (usando StringFormat() se volessi controllare il formato). L'utente vedrà immediatamente il risultato delle sue azioni e potrà cambiarlo se non è adatto alle sue esigenze, oppure lasciarlo.
es.
#define EDIT_BOX "EditBox"
int OnInit()
{
ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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);
}
}
Personalmente, adotterei un approccio come questo:
Una volta che ENDEDIT accade, cast l'OBJ_TEXT in un doppio e poi spingerlo di nuovo nella casella di modifica come una stringa (usando StringFormat() se volessi controllare il formato). L'utente vedrà immediatamente il risultato delle sue azioni e potrà cambiarlo se non è adatto alle sue esigenze, oppure lasciarlo.
es.
#define EDIT_BOX "EditBox"
int OnInit()
{
ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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);
}
}
Avrete bisogno di un modo per convalidare l'input. (un pulsante aggiuntivo ?)
Mantenetelo semplice. Comunque, come desideri :p
Avrai bisogno di un modo per convalidare il tuo input. (un pulsante aggiuntivo?)
Non sono sicuro di seguire...?
Potrei aver frainteso l'intenzione dell'OP, ma credo che l'interfaccia sarà dinamica, cioè un cambiamento in questa casella di modifica comporterà un aggiornamento di un'altra casella di conseguenza.
Si potrebbe avere un pulsante di convalida, ma se il risultato viene semplicemente visualizzato (piuttosto che agire) potrebbe essere un'aggiunta non necessaria. Ma non sono sicuro - l'OP avrebbe bisogno di chiarire.
Mantienilo semplice. Comunque, come vuoi tu :p
Sono molto d'accordo con il mantenere le cose semplici. C'è qualcosa di più semplice di questo?
ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);
PS Non sono sicuro che sia come desidero, è solo una discussione accademica per me - non ne ho bisogno!
Non sono sicuro di seguire...?
...Se la prendiamo come una richiesta generale: "Come controllare se il contenuto di una variabile è numerico?", la soluzione più elegante è usare un'espressione regolare.