Как проверить, является ли содержимое переменной числовым? - страница 2

 

MathIsValidNumber() принимает двойное число. Пожалуйста, проверьте документацию.

Вы передаете ей строку.

Если бы вы не игнорировали мои комментарии об использовании #property strict, вы бы увидели, что компилятор предупреждает вас об этом.

Если вы берете строку букв и превращаете ее в двойку, то значение двойки становится равным 0.

0 - это допустимое число.

Поэтому ваш код возвращает true.

 
honest_knave:

MathIsValidNumber() принимает двойное число. Пожалуйста, проверьте документацию.

Вы передаете ей строку.

Если бы вы не игнорировали мои комментарии об использовании #property strict, вы бы увидели, что компилятор предупреждает вас об этом.

Если вы возьмете строку букв и превратите ее в двойку, значение двойки станет 0.

0 - это допустимое число.

Поэтому ваш код возвращает true.

Но вы не сказали в своем ответе, что MathIsValidNumber() сравнивает только двойки, а не строки. Кстати, какое число не является действительным? Разве что комплексные числа или бесконечности, а кто, кстати, хочет их использовать в MQL4. Как бы то ни было, "Ключевое слово" кажется вводящим в заблуждение.
 
macpee:
Но вы не сказали мне в своем ответе, что MathIsValidNumber() сравнивает только двойные числа, а не строки. Кстати, какое число не является действительным? Разве что комплексные числа или бесконечности, а кто, кстати, хочет использовать их в MQL4. Как бы то ни было, "Ключевое слово" кажется вводящим в заблуждение.
Поэтому я снова спрашиваю, какой командой можно указать компилятору, чтобы он решил, что переменная содержит строку, а не число? Спасибо за ожидаемый ответ. В visual basic я помню такое ключевое слово, как "Isnumeric".
 
macpee:
Но вы не сказали мне в своем ответе, что MathIsValidNumber() сравнивает только double, а не строки.

Я предполагал, что вы потрудитесь проверить документацию...

И если бы вы не продолжали игнорировать мой совет насчет #property strict...

macpee:
Итак, я снова спрашиваю, какой командой указать компилятору, что переменная содержит строку, а не число? Спасибо за ожидаемый ответ.

Если вы не ожидаете, что значение когда-либо будет равно 0, переведите строку в двойное число и проверьте, что оно не равно 0.

 
honest_knave:

Я предполагал, что вы потрудитесь проверить документацию...

И если вы этого не сделали, то продолжайте игнорировать мой совет о #property strict...

Если вы не ожидаете, что значение когда-либо будет равно 0, приведите строку к двойному значению и проверьте, что оно не равно 0.

Хороший ответ. Теперь я могу попробовать. Но что происходит с числом 0. Я предполагаю, что это двойное значение, а также целочисленное значение. Когда вы приводите строку, она возвращает 0, когда вы вводите 0, она возвращает 0. Так что...?
 
macpee:
Но что происходит с числом ноль. Я предполагаю, что это двойное значение, а также целочисленное. Когда вы приводите строку, она возвращает 0, когда вы вводите 0, она возвращает 0. Итак...?

Да, это проблема.

Вы можете выполнить сравнение строк, если приведенное значение = 0

т.е. if(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);
  }  
//+------------------------------------------------------------------+
honest_knave:

Да, это проблема.

Вы можете выполнить сравнение строк, если приведенное значение = 0

т.е. if(cast_value == 0 && str_value == "0").

Но вам придется думать о вводе 0.0 или 0.00.

Можно разбить строку на символьные массивы и проверить каждый символ.

Зависит от того, насколько это важно.

Да, что-то в этом роде.

Вам нужно быть осторожным в отношении:

  • Множественные десятичные точки (пройдут, но не должны)
  • Использование символов + и - (не пройдет, но должно пройти)
  • Использование символа , как разделителя тысяч или как десятичной точки (не пройдет, но должно пройти).
  • Одиночная десятичная точка без других символов (пройдет, но не должна)
  • Числа, превышающие возможности актеров
 
honest_knave:

Да, такого рода вещи.

Вам нужно быть осторожным в отношении:

  • Множественные десятичные точки (пройдет, но не должно)
  • Использование символов + и - (не пройдет, но должно пройти)
  • Использование символа , как разделителя тысяч или как десятичной точки (не пройдет, но должно пройти).
  • Одиночная десятичная точка без других символов (пройдет, но не должна)
  • Числа, превышающие возможности актеров
  • Пробелы
 

Ernst Van Der Merwe:

  • Места

Да, хорошая мысль!