如何检查一个变量的内容是否是数字? - 页 4 12345 新评论 honest_knave 2017.02.17 13:58 #31 Alain Verleyen: 你真的很喜欢复杂化。如果目标只是处理实数,那就用StringToDouble() 和对特殊情况0的处理。这就是最初的解决方案。 honest_knave:如果你不希望这个值是0,就把字符串类型转换为一个双数,然后测试它是否等于0。然而,OP希望能够区分0是输入的值,还是0是字符串是一个无效数字的结果。0 "和 "sfdlgkjsflkjdsklfsd "用StringToDouble()或(double)都会导致0。这对OP来说是不可接受的,然后催生了这个后续讨论。 Alain Verleyen 2017.02.17 14:06 #32 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 } } honest_knave 2017.02.17 14:06 #33 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被输入。你可以把字符串转换成一个字符数组,然后测试每个字符。这要看这有多重要。 Alain Verleyen 2017.02.17 14:25 #34 honest_knave:那么0.00呢?或+0.00?或者0.0? 这就是为什么我说 "简化的例子"。我不会为OP做这个工作。 honest_knave 2017.02.17 14:34 #35 Alain Verleyen: 这就是为什么我说 "简化的例子"。我不会为OP做这个工作。这是一个有趣的练习,然而,也就是说,是有一个 "0 "的可能变化列表,还是只测试所有的东西?前者可以说更快,但有可能遗漏一个合法的变体。然而,如果只在CHARTEVENT_OBJECT_ENDEDIT 上测试,那么速度有多重要?不管怎么说,我相信OP现在有很多东西可以做了!这就是为什么我说 "简化"。 Alain Verleyen 2017.02.17 14:48 #36 honest_knave: 这是一个有趣的练习,然而,也就是说,是有一个 "0 "的可能变化列表,还是只测试所有的东西?前者可以说更快,但有可能遗漏一个合法的变体。然而,如果只在CHARTEVENT_OBJECT_ENDEDIT 上测试,那么速度有多重要?不管怎么说,我相信OP现在有很多东西可以去做了! 你也可以要求将零输入为 "0",并拒绝所有其他情况。 或者使用正则表达式:-D honest_knave 2017.02.17 14:52 #37 Alain Verleyen: 你也可以要求把零输入为 "0",并拒绝所有其他情况。或者使用正则表达式 :-D就个人而言,我会采取这样的方法。一旦ENDEDIT发生,就把OBJ_TEXT 转换成一个双数,然后把它作为一个字符串推回到编辑框中(如果我想控制 格式,就用StringFormat())。用户将立即看到他们的操作结果,如果不适合他们的需要,可以改变它,或者离开它。比如说#property strict#define EDIT_BOX "EditBox"int OnInit() { ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0); ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200); ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200); ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100); ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20); ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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); } } How do I check 专家顾问 - 杂项问题 Help with chart event Alain Verleyen 2017.02.17 16:18 #38 honest_knave:就个人而言,我会采取这样的方法。一旦ENDEDIT发生,就把OBJ_TEXT 转换成一个双数,然后把它作为一个字符串推回到编辑框中(如果我想控制格式,就用StringFormat())。用户将立即看到他们的操作结果,如果不适合他们的需要,可以改变它,或者离开它。例如#property strict#define EDIT_BOX "EditBox"int OnInit() { ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0); ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200); ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200); ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100); ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20); ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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 honest_knave 2017.02.17 16:30 #39 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 我不确定这是否如我所愿,这对我来说只是一场学术讨论--我没有必要这样做! Alain Verleyen 2017.02.17 18:52 #40 honest_knave: 我不知道我是否明白......?... 老实说,我不知道OP的意图 如果我们把它当作一个一般的请求:"如何检查 一个变量的内容是否为数字?",最优雅的解决方案是使用正则表达式。 12345 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
你真的很喜欢复杂化。如果目标只是处理实数,那就用StringToDouble() 和对特殊情况0的处理。
这就是最初的解决方案。
如果你不希望这个值是0,就把字符串类型转换为一个双数,然后测试它是否等于0。
然而,OP希望能够区分0是输入的值,还是0是字符串是一个无效数字的结果。0 "和 "sfdlgkjsflkjdsklfsd "用StringToDouble()或(double)都会导致0。
这对OP来说是不可接受的,然后催生了这个后续讨论。
这就是最初的解决方案。
然而,操作者希望能够区分0是输入的值,还是0是字符串是一个无效数字的结果。0 "和 "sfdlgkjsflkjdsklfsd "用StringToDouble()或(double)都会导致0。
这对OP来说是不可接受的,然后催生了这个后续讨论。
简化的例子:
if(value==0)
{
if(inputs=="0" || inputs=="0.0")
{
//--- all is ok
}
else
{
//--- wrong inputs
}
}
这就是为什么我说 "以及对特殊情况0的处理"。
简化的例子:
if(value==0)
{
if(inputs=="0" || inputs=="0.0")
{
//--- all is ok
}
else
{
//--- wrong inputs
}
}
那么0.00呢?
或+0.00?
或者0.0?
是的,这是个问题。
你可以做一个字符串比较,如果cast值=0的话
i.e. if(cast_value == 0 && str_value == "0")
但你必须考虑到0.0或0.00被输入。
你可以把字符串转换成一个字符数组,然后测试每个字符。
这要看这有多重要。
那么0.00呢?
或+0.00?
或者0.0?
这就是为什么我说 "简化的例子"。我不会为OP做这个工作。
这是一个有趣的练习,然而,也就是说,是有一个 "0 "的可能变化列表,还是只测试所有的东西?
前者可以说更快,但有可能遗漏一个合法的变体。
然而,如果只在CHARTEVENT_OBJECT_ENDEDIT 上测试,那么速度有多重要?
不管怎么说,我相信OP现在有很多东西可以做了!这就是为什么我说 "简化"。
这是一个有趣的练习,然而,也就是说,是有一个 "0 "的可能变化列表,还是只测试所有的东西?
前者可以说更快,但有可能遗漏一个合法的变体。
然而,如果只在CHARTEVENT_OBJECT_ENDEDIT 上测试,那么速度有多重要?
不管怎么说,我相信OP现在有很多东西可以去做了!
或者使用正则表达式:-D
你也可以要求把零输入为 "0",并拒绝所有其他情况。或者使用正则表达式 :-D
就个人而言,我会采取这样的方法。
一旦ENDEDIT发生,就把OBJ_TEXT 转换成一个双数,然后把它作为一个字符串推回到编辑框中(如果我想控制 格式,就用StringFormat())。用户将立即看到他们的操作结果,如果不适合他们的需要,可以改变它,或者离开它。
比如说
#define EDIT_BOX "EditBox"
int OnInit()
{
ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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);
}
}
就个人而言,我会采取这样的方法。
一旦ENDEDIT发生,就把OBJ_TEXT 转换成一个双数,然后把它作为一个字符串推回到编辑框中(如果我想控制格式,就用StringFormat())。用户将立即看到他们的操作结果,如果不适合他们的需要,可以改变它,或者离开它。
例如
#define EDIT_BOX "EditBox"
int OnInit()
{
ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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
你将需要一种方法来验证你的输入。(一个额外的按钮?)
我不确定我是否理解......?
我可能误解了OP的意图,但我相信界面将是动态的,也就是说,这个编辑框的变化将导致另一个框的相应更新。
你可以有一个验证按钮,但如果结果只是显示(而不是操作),这可能是一个不必要的补充。但我不确定 - OP需要澄清。
保持简单。总之,如你所愿 :p
我非常同意保持事情的简单性。还有比这更简单的吗?
ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);
PS 我不确定这是否如我所愿,这对我来说只是一场学术讨论--我没有必要这样做!
我不知道我是否明白......?
...如果我们把它当作一个一般的请求:"如何检查 一个变量的内容是否为数字?",最优雅的解决方案是使用正则表达式。