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

 

MathIsValidNumber() aceita um duplo. Por favor, verifique a documentação.

Você está dando uma seqüência.

Se você não continuar ignorando meus comentários sobre o uso de #propriedade estrita, você verá que o compilador o adverte sobre isto.

Se você pegar uma cadeia de letras e transformá-la em duplo, o valor do duplo se torna 0.

0 é um número válido.

Por isso, seu código está retornando verdadeiro.

 
honest_knave:

MathIsValidNumber() aceita um duplo. Por favor, verifique a documentação.

Você está dando uma seqüência.

Se você não continuar ignorando meus comentários sobre o uso de #propriedade estrita, você verá que o compilador o adverte sobre isto.

Se você pegar uma cadeia de letras e transformá-la em duplo, o valor do duplo se torna 0.

0 é um número válido.

Por isso, seu código está retornando verdadeiro.

Mas você não me disse em sua resposta que MathIsValidNumber() compara apenas o dobro, e não cordas. A propósito, qual número não é um número válido? Exceto números complexos ou infinitos, e quem quer utilizá-los na MQL4, a propósito. De qualquer forma, a "Palavra-chave" parece enganadora.
 
macpee:
Mas você não me disse em sua resposta que MathIsValidNumber() compara apenas o dobro, e não cordas. A propósito, qual número não é um número válido? Exceto números complexos ou infinitos, e quem quer utilizá-los na MQL4, a propósito. De qualquer forma, a "Palavra-chave" parece enganadora.
Então, pergunto novamente, qual é o comando para dizer ao compilador para decidir se uma variável contém uma string e não qualquer forma de número? Obrigado por sua resposta antecipada. No visual básico, lembro-me de uma palavra-chave como "Isnumérico".
 
macpee:
Mas você não me disse em sua resposta que MathIsValidNumber() compara apenas o dobro, e não strings.

Presumi que você poderia ter se dado ao trabalho de verificar a documentação...

E se você não continuasse ignorando meus conselhos sobre #propriedade rigorosa...

macpee:
Então agora pergunto novamente, qual é o comando para dizer ao compilador para decidir que uma variável contém um fio e não qualquer forma de número? Obrigado por sua resposta antecipada.

Se você não espera que o valor seja 0, digite a string para um duplo e teste que não é igual a 0.

 
honest_knave:

Presumi que você poderia ter se dado ao trabalho de verificar a documentação...

E se você não continuasse ignorando meus conselhos sobre #propriedade rigorosa...

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

Boa resposta. Agora eu posso tentar. Mas o que acontece com o número zero. Presumo que seja um valor duplo, bem como um valor inteiro. Quando você lança string ele retorna 0, quando você insere 0, ele retorna 0. Então...?
 
macpee:
Mas o que acontece com o número zero. Presumo que seja um valor duplo, bem como um valor inteiro. Quando você lança a string ele retorna 0, quando você insere 0, ele retorna 0. Então...?

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

 
void OnStart()
  {
//---
   ObjectCreate("SimultaneousReleaseIndex1",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex1",OBJPROP_TEXT,"Four");
   ObjectCreate("SimultaneousReleaseIndex2",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex2",OBJPROP_TEXT,"44");
   ObjectCreate("SimultaneousReleaseIndex3",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex3",OBJPROP_TEXT,"Forty4");
   ObjectCreate("SimultaneousReleaseIndex4",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex4",OBJPROP_TEXT,".1234567890");
  
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex1",OBJPROP_TEXT)))
      Print("text1 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex2",OBJPROP_TEXT)))
      Print("text2 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex3",OBJPROP_TEXT)))
      Print("text3 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex4",OBJPROP_TEXT)))
      Print("text4 is numeric");
  }
//---
bool IsNumeric(string text)
  {
   int length=StringLen(text);
   for(int i=0;i<length;i++)
     {
      int char1=StringGetChar(text,i);
      if((char1>47 && char1<58) || char1==46)
         continue;
      else
         return(false);
     }
   return(true);
  }  
//+------------------------------------------------------------------+
 
Ernst Van Der Merwe:
void OnStart()
  {
//---
   ObjectCreate("SimultaneousReleaseIndex1",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex1",OBJPROP_TEXT,"Four");
   ObjectCreate("SimultaneousReleaseIndex2",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex2",OBJPROP_TEXT,"44");
   ObjectCreate("SimultaneousReleaseIndex3",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex3",OBJPROP_TEXT,"Forty4");
   ObjectCreate("SimultaneousReleaseIndex4",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex4",OBJPROP_TEXT,".1234567890");
  
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex1",OBJPROP_TEXT)))
      Print("text1 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex2",OBJPROP_TEXT)))
      Print("text2 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex3",OBJPROP_TEXT)))
      Print("text3 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex4",OBJPROP_TEXT)))
      Print("text4 is numeric");
  }
//---
bool IsNumeric(string text)
  {
   int length=StringLen(text);
   for(int i=0;i<length;i++)
     {
      int char1=StringGetChar(text,i);
      if((char1>47 && char1<58) || char1==46)
         continue;
      else
         return(false);
     }
   return(true);
  }  
//+------------------------------------------------------------------+
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 é.

Sim, esse tipo de coisa.

Você precisaria ter cuidado com isso:

  • Múltiplos pontos decimais (passariam mas não deveriam passar)
  • Uso de símbolos + e - (não passaria mas deveria)
  • Uso de , ou como separador de milhares, ou como ponto decimal (não passaria mas deveria passar)
  • Um ponto decimal solitário, sem outros caracteres (passaria mas não deveria)
  • Números além da capacidade do elenco
 
honest_knave:

Sim, esse tipo de coisa.

Você precisaria ter cuidado:

  • Múltiplos pontos decimais (passariam mas não deveriam passar)
  • Uso de símbolos + e - (não passaria mas deveria)
  • Uso de , ou como separador de milhares, ou como ponto decimal (não passaria mas deveria passar)
  • Um ponto decimal solitário, sem outros caracteres (passaria mas não deveria)
  • Números além da capacidade do elenco
  • Espaços
 

Ernst Van Der Merwe:

  • Espaços

Sim, bem visto!