Como posso verificar se o conteúdo de uma variável é numérico? - página 4

 
Alain Verleyen:
Você realmente gosta da complicação . Se o objetivo é apenas processar números reais, use StringToDouble() e um processamento de caso especial 0.

Essa foi a solução inicial:

honest_knave:

Se você não espera que o valor seja sempre 0, digite o dobro e teste que não é igual a 0.

Entretanto, o OP queria ser capaz de lidar com a distinção se 0 era o valor inserido, ou se 0 era o resultado de a string ser um número inválido. Tanto "0" como "sfdlgkjsflkjdsklfsd" vão resultar em 0 com StringToDouble() ou (duplo).

Isto foi inaceitável para a OP que então gerou esta discussão subseqüente.

 
honest_knave:

Essa foi a solução inicial:

Entretanto, a OP queria ser capaz de lidar com a distinção se 0 era o valor inserido, ou se 0 era o resultado de a cadeia ser um número inválido. Tanto "0" como "sfdlgkjsflkjdsklfsd" vão resultar em 0 com StringToDouble() ou (duplo).

Isto foi inaceitável para a OP que então gerou esta discussão subseqüente.

Por isso eu disse "e um processamento de caso especial 0".

Exemplo simplificado :
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }
 
Alain Verleyen:
É por isso que eu disse "e um processamento de caso especial 0".

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

E quanto às 0,00?

Ou +0,00?

Ou 0,0?


honest_knave:

Sim, isso é um problema.

Você poderia fazer uma comparação de cordas se o valor de elenco = 0

i.e. if(cast_value == 0 && str_value == "0")

Mas você teria que pensar em 0,0 ou 0,00 sendo inseridos.

Você poderia estourar a corda em uma matriz de caracteres e testar cada caractere.

Depende de quão importante isto é.

 
honest_knave:

E quanto às 0,00?

Ou +0,00?

Ou 0,0?


Foi por isso que eu disse "Exemplo simplificado". Não vou fazer o trabalho para a OP.

 
Alain Verleyen:
É por isso que eu disse "Exemplo simplificado". Eu não farei o trabalho para a OP.

É um exercício interessante, mas será melhor ter uma lista de possíveis variações de "0", ou apenas testar tudo?

O primeiro é indiscutivelmente mais rápido, mas com o risco de faltar uma variação legítima.

Entretanto, quão importante é a velocidade quando ela só deve ser testada em umCHARTEVENT_OBJECT_ENDEDIT?

Independentemente disso, tenho certeza de que a OP agora tem muito que continuar!

 
honest_knave:

É um exercício interessante, mas será melhor ter uma lista de possíveis variações de "0", ou apenas testar tudo?

O primeiro é indiscutivelmente mais rápido, mas com o risco de faltar uma variação legítima.

Entretanto, quão importante é a velocidade quando ela só deve ser testada em umCHARTEVENT_OBJECT_ENDEDIT?

Independentemente disso, tenho certeza de que a OP agora tem muito que continuar!

Você também poderia pedir para inserir zero como "0" e rejeitar todos os outros casos.

Ou usando a expressão regular:-D
 
Alain Verleyen:
Você também pode pedir para inserir zero como "0" e rejeitar todos os outros casos.

Ou usando a expressão regular :-D

Pessoalmente, eu estaria adotando uma abordagem como esta:

Uma vez que o ENDEDIT aconteça, lance o OBJ_TEXT em um duplo e depois empurre-o de volta para a caixa de edição como uma string (usando StringFormat() se eu quisesse controlar o formato). O usuário verá imediatamente o resultado de suas ações e poderá alterá-lo se não se adequar às suas necessidades, ou deixá-lo.

Por exemplo

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

Pessoalmente, eu estaria adotando uma abordagem como esta:

Uma vez que o ENDEDIT aconteça, lance o OBJ_TEXT em um duplo e depois empurre-o de volta para a caixa de edição como uma string (usando StringFormat() se eu quisesse controlar o formato). O usuário verá imediatamente o resultado de suas ações e poderá alterá-lo se não se adequar às suas necessidades, ou deixá-lo.

Por exemplo

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

Você precisará de uma maneira de validar sua entrada. (um botão adicional ?)

Mantenha-o simples. De qualquer forma, como você desejar :p

 
Alain Verleyen:

Você precisará de uma maneira de validar sua contribuição. (um botão adicional ?)

Não tenho certeza se estou seguindo...?

Posso ter entendido mal a intenção do OP, mas acredito que a interface será dinâmica, ou seja, uma mudança nesta caixa de edição resultará em uma atualização de outra caixa de acordo.

Você poderia ter um botão de validação, mas se o resultado for simplesmente exibido (em vez de acionado), pode ser uma adição desnecessária. Mas não tenho certeza - a OP precisaria esclarecer.

Alain Verleyen:

Mantenha-o simples. De qualquer forma, como você desejar :p

Eu concordo muito em manter as coisas simples. Será que fica mais simples do que isto?

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

PS Não tenho certeza se é como eu desejo, é apenas uma discussão acadêmica para mim - não tenho necessidade disso!

 
honest_knave:

Não tenho certeza se estou seguindo...?

...
Sinceramente, não tenho idéia da intenção da OP
. Se tomarmos como um pedido geral: "Como verificar se o conteúdo de uma variável é numérico?", a solução mais elegante é usar a expressão regular.