¿Cómo puedo comprobar si el contenido de una variable es numérico? - página 4

 
Alain Verleyen:
Realmente te gusta la complicación . Si el objetivo es solo procesar números reales, usa StringToDouble() y un procesamiento del caso especial 0.

Esa era la solución inicial:

honest_knave:

Si no esperas que el valor sea nunca 0, convierte la cadena en un double y comprueba que no es igual a 0.

Sin embargo, el OP quería ser capaz de distinguir si el 0 era el valor introducido, o si el 0 era el resultado de que la cadena fuera un número inválido. Tanto "0" como "sfdlgkjsflkjdsklfsd" van a resultar en 0 con StringToDouble() o (double).

Esto era inaceptable para el OP que luego generó esta discusión posterior.

 
honest_knave:

Esa era la solución inicial:

Sin embargo, el OP quería ser capaz de distinguir si el 0 era el valor introducido, o si el 0 era el resultado de que la cadena fuera un número inválido. Tanto "0" como "sfdlgkjsflkjdsklfsd" van a resultar en 0 con StringToDouble() o (double).

Esto era inaceptable para el OP, que luego dio lugar a esta discusión posterior.

Por eso dije "y un procesamiento del caso especial 0".

Ejemplo simplificado :
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }
 
Alain Verleyen:
Por eso dije "y un procesamiento del caso especial 0".

Ejemplo simplificado :
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }

¿Y qué pasa con el 0,00?

¿O +0,00?

¿O 0,00?


honest_knave:

Sí, eso es un problema.

Podrías hacer una comparación de cadenas si el valor fundido = 0

es decir, if(cast_value == 0 && str_value == "0")

Pero tendrías que pensar en que se introduzca 0,0 o 0,00.

Podrías reventar la cadena en un array de caracteres y probar cada carácter.

Depende de lo importante que sea esto.

 
honest_knave:

¿Y qué pasa con el 0,00?

¿O +0,00?

¿O 0,00?


Por eso he dicho "ejemplo simplificado". No voy a hacer el trabajo para el OP.

 
Alain Verleyen:
Por eso he dicho "ejemplo simplificado". No voy a hacer el trabajo para el OP.

No obstante, es un ejercicio interesante: ¿es mejor tener una lista de posibles variaciones de "0" o simplemente probarlo todo?

Podría decirse que la primera opción es más rápida, pero se corre el riesgo de pasar por alto una variación legítima.

Sin embargo, ¿qué importancia tiene la velocidad cuando sólo debe probarse en unCHARTEVENT_OBJECT_ENDEDIT?

En cualquier caso, estoy seguro de que el candidato tiene ahora mucho que hacer.

 
honest_knave:

No obstante, es un ejercicio interesante: ¿es mejor tener una lista de posibles variaciones de "0" o simplemente probarlo todo?

Podría decirse que la primera opción es más rápida, pero se corre el riesgo de pasar por alto una variación legítima.

Sin embargo, ¿qué importancia tiene la velocidad cuando sólo debe probarse en unCHARTEVENT_OBJECT_ENDEDIT?

En cualquier caso, estoy seguro de que el candidato tiene ahora mucho que hacer.

También podría pedir que se introduzca el cero como "0" y rechazar todos los demás casos.

O utilizar una expresión regular:-D
 
Alain Verleyen:
También podría pedir que se introduzca el cero como "0" y rechazar todos los demás casos.

O utilizando una expresión regular :-D

Personalmente, yo tomaría un enfoque como este:

Una vez que se produzca el ENDEDIT, convertiría el OBJ_TEXT en un double y lo devolvería al cuadro de edición como una cadena (utilizando StringFormat() si quisiera controlar el formato). El usuario verá inmediatamente el resultado de sus acciones y podrá cambiarlo si no se ajusta a sus necesidades, o dejarlo.

Por ejemplo

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

Personalmente, yo tomaría un enfoque como este:

Una vez que se produzca el ENDEDIT, convertiría el OBJ_TEXT en un double y lo devolvería al cuadro de edición como una cadena (utilizando StringFormat() si quisiera controlar el formato). El usuario verá inmediatamente el resultado de sus acciones y podrá cambiarlo si no se ajusta a sus necesidades, o dejarlo.

Por ejemplo

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

Necesitará una forma de validar su entrada. (¿un botón adicional?)

Que sea sencillo. En fin, como quieras :p

 
Alain Verleyen:

Necesitará una manera de validar su entrada. (¿un botón adicional?)

No estoy seguro de entender...

Puede que haya entendido mal la intención del OP, pero creo que la interfaz será dinámica, es decir, un cambio en este cuadro de edición dará lugar a una actualización de otro cuadro en consecuencia.

Podría tener un botón de validación, pero si el resultado se muestra simplemente (en lugar de actuar) puede ser una adición innecesaria. Pero no estoy seguro - el OP tendría que aclarar.

Alain Verleyen:

Manténgalo simple. De todos modos, como quieras :p

Estoy muy de acuerdo con mantener las cosas simples. ¿Hay algo más sencillo que esto?

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

P.D. No estoy seguro de que sea como deseo, es sólo una discusión académica para mí - ¡no tengo necesidad de ella!

 
honest_knave:

No estoy seguro de seguir...

...
Sinceramente, no tengo ni idea de la intención del OP
Si lo tomamos como una petición general: "¿Cómo comprobar si el contenido de una variable es numérico?", la solución más elegante es usar una expresión regular.