![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
MathIsValidNumber() принимает двойное число. Пожалуйста, проверьте документацию.
Вы передаете ей строку.
Если бы вы не игнорировали мои комментарии об использовании #property strict, вы бы увидели, что компилятор предупреждает вас об этом.
Если вы берете строку букв и превращаете ее в двойку, то значение двойки становится равным 0.
0 - это допустимое число.
Поэтому ваш код возвращает true.
MathIsValidNumber() принимает двойное число. Пожалуйста, проверьте документацию.
Вы передаете ей строку.
Если бы вы не игнорировали мои комментарии об использовании #property strict, вы бы увидели, что компилятор предупреждает вас об этом.
Если вы возьмете строку букв и превратите ее в двойку, значение двойки станет 0.
0 - это допустимое число.
Поэтому ваш код возвращает true.
Но вы не сказали мне в своем ответе, что MathIsValidNumber() сравнивает только двойные числа, а не строки. Кстати, какое число не является действительным? Разве что комплексные числа или бесконечности, а кто, кстати, хочет использовать их в MQL4. Как бы то ни было, "Ключевое слово" кажется вводящим в заблуждение.
Но вы не сказали мне в своем ответе, что MathIsValidNumber() сравнивает только double, а не строки.
Я предполагал, что вы потрудитесь проверить документацию...
И если бы вы не продолжали игнорировать мой совет насчет #property strict...
Итак, я снова спрашиваю, какой командой указать компилятору, что переменная содержит строку, а не число? Спасибо за ожидаемый ответ.
Если вы не ожидаете, что значение когда-либо будет равно 0, переведите строку в двойное число и проверьте, что оно не равно 0.
Я предполагал, что вы потрудитесь проверить документацию...
И если вы этого не сделали, то продолжайте игнорировать мой совет о #property strict...
Если вы не ожидаете, что значение когда-либо будет равно 0, приведите строку к двойному значению и проверьте, что оно не равно 0.
Но что происходит с числом ноль. Я предполагаю, что это двойное значение, а также целочисленное. Когда вы приводите строку, она возвращает 0, когда вы вводите 0, она возвращает 0. Итак...?
Да, это проблема.
Вы можете выполнить сравнение строк, если приведенное значение = 0
т.е. if(cast_value == 0 && str_value == "0").
Но вам придется думать о вводе 0.0 или 0.00.
Можно разбить строку на символьные массивы и проверить каждый символ.
Зависит от того, насколько это важно.
{
//---
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);
}
//+------------------------------------------------------------------+
{
//---
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);
}
//+------------------------------------------------------------------+
Да, это проблема.
Вы можете выполнить сравнение строк, если приведенное значение = 0
т.е. if(cast_value == 0 && str_value == "0").
Но вам придется думать о вводе 0.0 или 0.00.
Можно разбить строку на символьные массивы и проверить каждый символ.
Зависит от того, насколько это важно.
Да, что-то в этом роде.
Вам нужно быть осторожным в отношении:
Да, такого рода вещи.
Вам нужно быть осторожным в отношении:
Ernst Van Der Merwe: