如何检查一个变量的内容是否是数字? - 页 2

 

MathIsValidNumber()接受一个双数。请查看 文档。

你给它的是一个字符串

如果你不是一直无视我关于使用#property strict的 评论,你会看到编译器警告你这一点。

如果你把一串字母变成了一个双数,那么这个双数的值就变成了0

0是一个有效的数字。

这就是为什么你的代码会返回真。

 
honest_knave:

MathIsValidNumber()接受一个双数。请查看文档。

你给它的是一个字符串

如果你不是一直无视我关于使用#property strict的 评论,你会看到编译器警告你这一点。

如果你把一串字母变成了一个双数,那么这个双数的值就变成了0

0是一个有效的数字。

这就是为什么你的代码会返回真。

但你没有告诉我MathIsValidNumber()只比较双数,而不是字符串。顺便问一下,哪些数字不是有效数字?除了复数或无穷数,顺便说一下,谁想在MQL4中使用它们。总之,"关键字 "似乎有误导性。
 
macpee:
但你在答案中没有告诉我,MathIsValidNumber()只比较双数,而不是字符串。顺便问一下,哪个数字不是有效数字?除了复数或无穷数,顺便说一下,谁想在MQL4中使用它们。总之,这个 "关键词 "似乎有误导性。
所以我现在再问一遍,什么命令可以告诉编译器决定一个变量是否持有一个字符串而不是任何形式的数字?谢谢你的预期回答。在visual basic中,我记得有一个关键字,如 "Isnumeric"。
 
macpee:
但你没有告诉我,MathIsValidNumber()只比较双数,而不是字符串。

我认为你可能已经费力地查看了 文档......

如果你没有继续无视我关于#属性严格的建议...

macpee
所以我现在再问一遍,什么命令可以告诉编译器决定一个变量持有一个字符串而不是任何形式的数字?谢谢你的预期答案。

如果你不希望数值为0,可以将字符串类型转换为双数,然后测试它是否等于0。

 
honest_knave:

我认为你可能已经费力地查看了文档......

如果你没有继续无视我关于#属性严格的建议...

如果你不希望该值为0,可以将字符串类型转换为双数,并测试它是否等于0。

回答得好。我现在可以试试了。但是数字0会发生什么。我猜想它是一个双倍值,也是一个整数值。当你投掷字符串时,它返回0,当你输入0时,它返回0,那么...?
 
macpee:
但是,数字0会怎么样。我猜想它是一个双倍值,也是一个整数值。当你投掷字符串时,它返回0,当你输入0时,它返回0,那么...?

是的,这是个问题。

如果cast值=0,你可以做一个字符串比较

也就是说,如果(cast_value == 0 && str_value == "0")

但你必须考虑到0.0或0.00被输入。

你可以把字符串转换成一个字符数组,然后测试每个字符。

这要看这有多重要

 
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);
  }  
//+------------------------------------------------------------------+
诚实_knave

是的,这是个问题。

如果cast值=0,你可以做一个字符串比较

也就是说,如果(cast_value == 0 && str_value == "0")

但你必须考虑到0.0或0.00被输入。

你可以把字符串转换成一个字符数组,然后测试每个字符。

这要看这有多重要。

是的,这类事情。

你需要注意的是。

  • 多个小数点(可以通过,但不应该)。
  • 使用+和-符号(不会通过,但应该通过)
  • 使用,作为千位分隔符,或作为小数点(不会通过,但应该)。
  • 一个单独的小数点,没有其他字符(可以通过,但不应该)。
  • 超过演员能力的数字
 
honest_knave:

是的,这类事情。

你需要注意的是。

  • 多个小数点(可以通过,但不应该)。
  • 使用+和-符号(不能通过,但应该通过)
  • 使用,作为千位分隔符,或作为小数点(不会通过,但应该)。
  • 一个单独的小数点,没有其他字符(可以通过,但不应该)。
  • 超出演员能力的数字
  • 空格
 

Ernst Van Der Merwe:

  • 空间

是的,说得好!