Поиск запятой в тексте

 
Привет программеры! Такой вопрос: можно ли (если да то как) найти в тексте посредством MQL4 запятую? Ситуация такая: написал панельку для закрытия ордера в неполном объеме и в поле "лот" нужно вписать собственно желаемый лот (например 0.01), но некоторые пишут лот через запятую и естественно ничего не происходит... Нужно придумать как выйти из ситуации. в идеале было бы круто если бы советник находил в тексте запятую и менял ее на точку. Но понятия не имею возможно ли это...
 
Maksim Neimerik:
Привет программеры! Такой вопрос: можно ли (если да то как) найти в тексте посредством MQL4 запятую? Ситуация такая: написал панельку для закрытия ордера в неполном объеме и в поле "лот" нужно вписать собственно желаемый лот (например 0.01), но некоторые пишут лот через запятую и естественно ничего не происходит... Нужно придумать как выйти из ситуации. в идеале было бы круто если бы советник находил в тексте запятую и менял ее на точку. Но понятия не имею возможно ли это...

StringReplace()

https://www.mql5.com/ru/docs/strings/stringreplace

Поиск - MQL5.community
Поиск - MQL5.community
  • www.mql5.com
Поиск выполняется с учетом морфологии и без учета регистра. Все буквы, независимо от того, как они введены, будут рассматриваться как строчные. По умолчанию наш поиск показывает страницы...
 
Maksim Neimerik:
Привет программеры! Такой вопрос: можно ли (если да то как) найти в тексте посредством MQL4 запятую? Ситуация такая: написал панельку для закрытия ордера в неполном объеме и в поле "лот" нужно вписать собственно желаемый лот (например 0.01), но некоторые пишут лот через запятую и естественно ничего не происходит... Нужно придумать как выйти из ситуации. в идеале было бы круто если бы советник находил в тексте запятую и менял ее на точку. Но понятия не имею возможно ли это...

Для этого имеется функция StringReplace. В специфических случаях можно посредством цикла обрабатывать строку. Ведь строка - это массив символов.

   string strVolume = "0,01";
   StringReplace(strVolume, ",", ".");
   Print(strVolume);
 
Всем спасибо!, буду разбираться...
 
Maksim Neimerik:
....в поле "лот" нужно вписать собственно желаемый лот (например 0.01), но некоторые пишут лот через запятую и естественно ничего не происходит... 
Ihor Herasko:

Для этого имеется функция StringReplace. В специфических случаях можно посредством цикла обрабатывать строку. Ведь строка - это массив символов.

А с какого боку тут StringReplace ?

Поле "лот" - это double. Поэтому никак запятую не поменяешь. 

А вот если поле "лот" объявить как string, то да, можно проверить и использовать StringToDouble.

Но в этом случае нужно ещё проверять не вписал ли пользователь лот прописью )))

В общем фигня. Если чел не может правильно указать лот (при том что умолчательный лот прописан с точкой), то нефиг ему вообще иметь дело ни с панельками, ни с торговлей вообще.

 
Сергей Таболин:

А с какого боку тут StringReplace ?

Поле "лот" - это double. Поэтому никак запятую не поменяешь. 

А вот если поле "лот" объявить как string, то да, можно проверить и использовать StringToDouble.

Но в этом случае нужно ещё проверять не вписал ли пользователь лот прописью )))

В общем фигня. Если чел не может правильно указать лот (при том что умолчательный лот прописан с точкой), то нефиг ему вообще иметь дело ни с панельками, ни с торговлей вообще.

Да, поле "лот" объявлено как string. Вы правы по поводу таких людей)), но я это не столько для них сколько для своего общего развития спрашиваю... Мало ли где пригодится...

 
Maksim Neimerik:

Да, поле "лот" объявлено как string. Вы правы по поводу таких людей)), но я это не столько для них сколько для своего общего развития спрашиваю... Мало ли где пригодится...

К примеру в графическом поле "Edit" при ручном вводе лота.

 
Vitaly Muzichenko:

К примеру в графическом поле "Edit" при ручном вводе лота.

там вообще @опа :-)

в зависимости от места проживания/воспитания  люди привыкли к десятичной точке или к запятой.

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

1'00,12 03 - это вполне себе double в виде текста :-)

 
Сергей Таболин:

А с какого боку тут StringReplace ?

Поле "лот" - это double. Поэтому никак запятую не поменяешь. 

Потому что ТС явно указал: "в тексте". Речь о строке. По крайней мере, я не видел таких интерфейсов, в которых число вводится прямо в double-формате)))

 
Ihor Herasko:

Потому что ТС явно указал: "в тексте". Речь о строке. По крайней мере, я не видел таких интерфейсов, в которых число вводится прямо в double-формате)))

Проморгал... (

 
Maksim Neimerik:
Привет программеры! Такой вопрос: можно ли (если да то как) найти в тексте посредством MQL4 запятую? Ситуация такая: написал панельку для закрытия ордера в неполном объеме и в поле "лот" нужно вписать собственно желаемый лот (например 0.01), но некоторые пишут лот через запятую и естественно ничего не происходит... Нужно придумать как выйти из ситуации. в идеале было бы круто если бы советник находил в тексте запятую и менял ее на точку. Но понятия не имею возможно ли это...

Лет шесть назад я написал скрипт, который позволяет распарсить буфер обмена копирования восьми ячеек из строки EXCEL. Там есть и поиск запятой, и замена ее на точку.

//+------------------------------------------------------------------+
//| Разбор внешнего праметра:   extern   string   Busket             |
//| Cтрока имеет формат s0 LF s1 LF s2 LF s3 LF s4 LF s5 LF s6 LF s7 |
//| где s? - это числа, LF = chr(9) - перевод строки                 |
//| Такой формат получается при копировании 8 ячеек строки из EXCEL  |
//| через буфер обиена                                               |
//| Выделенные из строки числа записываем в OriginalBusketString[]   |
//+------------------------------------------------------------------+
void StringToDoubleArray()
{
   int i, j, k, TextLength;
   string NewNumber, LineFeed = " ";
   double r, sum;
   LineFeed = StringSetChar( LineFeed, 0, 9);
   Busket = Busket + LineFeed; // дописываем перевод строки
   TextLength = StringLen(Busket);

// заменяем "," на "."
   while ( true )
   {
      j = StringFind( Busket, ",", 0);
      if ( j >= 0) Busket = StringSetChar( Busket, j, '.');
      else break;
   }
   
   i = 0; // позиция начала поиска в строке внешнего параметра
   k = 0; // счетчик количества найденных чисел
   sum = 0.0;
   while ( i < TextLength )
   {
      j = StringFind( Busket, LineFeed, i);
      if ( i == j )
         NewNumber = 0.0;
      else
         NewNumber = StringSubstr( Busket, i, j - i); //выделяем число
      r = StrToDouble( NewNumber ) * BuySell;
      OriginalBusketString[ k ] = r;
      sum += r * r;
      i = j + 1;
      k++;
   }
   sum = MathSqrt( sum );
   for ( i = k - 1; i >= 0; i--)
      OriginalBusketString[ i ] /= sum;
}
//--------------------- END StringToDoubleArray ----------------------
Причина обращения: