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

 
Alain Verleyen:
你真的很喜欢复杂化。如果目标只是处理实数,那就用StringToDouble() 和对特殊情况0的处理。

这就是最初的解决方案。

honest_knave:

如果你不希望这个值是0,就把字符串类型转换为一个双数,然后测试它是否等于0。

然而,OP希望能够区分0是输入的值,还是0是字符串是一个无效数字的结果。0 "和 "sfdlgkjsflkjdsklfsd "用StringToDouble()或(double)都会导致0。

这对OP来说是不可接受的,然后催生了这个后续讨论。

 
honest_knave:

这就是最初的解决方案。

然而,操作者希望能够区分0是输入的值,还是0是字符串是一个无效数字的结果。0 "和 "sfdlgkjsflkjdsklfsd "用StringToDouble()或(double)都会导致0。

这对OP来说是不可接受的,然后催生了这个后续讨论。

这就是为什么我说 "以及对特殊情况0的处理"。

简化的例子:
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }
 
Alain Verleyen:
这就是为什么我说 "以及对特殊情况0的处理"。

简化的例子:
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }

那么0.00呢?

或+0.00?

或者0.0?


honest_knave

是的,这是个问题。

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

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

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

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

这要看这有多重要。

 
honest_knave:

那么0.00呢?

或+0.00?

或者0.0?


这就是为什么我说 "简化的例子"。我不会为OP做这个工作。

 
Alain Verleyen:
这就是为什么我说 "简化的例子"。我不会为OP做这个工作。

这是一个有趣的练习,然而,也就是说,是有一个 "0 "的可能变化列表,还是只测试所有的东西?

前者可以说更快,但有可能遗漏一个合法的变体。

然而,如果只在CHARTEVENT_OBJECT_ENDEDIT 上测试,那么速度有多重要

不管怎么说,我相信OP现在有很多东西可以做了!这就是为什么我说 "简化"。

 
honest_knave:

这是一个有趣的练习,然而,也就是说,是有一个 "0 "的可能变化列表,还是只测试所有的东西?

前者可以说更快,但有可能遗漏一个合法的变体。

然而,如果只在CHARTEVENT_OBJECT_ENDEDIT 上测试,那么速度有多重要?

不管怎么说,我相信OP现在有很多东西可以去做了!

你也可以要求将零输入为 "0",并拒绝所有其他情况。

或者使用正则表达式:-D
 
Alain Verleyen:
你也可以要求把零输入为 "0",并拒绝所有其他情况。或者使用正则表达式 :-D

就个人而言,我会采取这样的方法。

一旦ENDEDIT发生,就把OBJ_TEXT 转换成一个双数,然后把它作为一个字符串推回到编辑框中(如果我想控制 格式,就用StringFormat())。用户将立即看到他们的操作结果,如果不适合他们的需要,可以改变它,或者离开它。

比如说

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

就个人而言,我会采取这样的方法。

一旦ENDEDIT发生,就把OBJ_TEXT 转换成一个双数,然后把它作为一个字符串推回到编辑框中(如果我想控制格式,就用StringFormat())。用户将立即看到他们的操作结果,如果不适合他们的需要,可以改变它,或者离开它。

例如

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

你将需要一种方法来验证你的输入。(一个额外的按钮?)

保持简单。总之,如你所愿 :p

 
Alain Verleyen:

你将需要一种方法来验证你的输入。(一个额外的按钮?)

我不确定我是否理解......?

我可能误解了OP的意图,但我相信界面将是动态的,也就是说,这个编辑框的变化将导致另一个框的相应更新。

你可以有一个验证按钮,但如果结果只是显示(而不是操作),这可能是一个不必要的补充。但我不确定 - OP需要澄清。

Alain Verleyen:

保持简单。总之,如你所愿 :p

我非常同意保持事情的简单性。还有比这更简单的吗?

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

PS 我不确定这是否如我所愿,这对我来说只是一场学术讨论--我没有必要这样做!

 
honest_knave:

我不知道我是否明白......?

...
老实说,我不知道OP的意图
如果我们把它当作一个一般的请求:"如何检查 一个变量的内容是否为数字?",最优雅的解决方案是使用正则表达式。