[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 58

 

Переделал немного функцию замены символов строки через массивы:

string StrReplaceTwo(string text){
string textMod[] ={""};
string symbols1[] = {"12","15","19","13","14","16"};

string symbols2[] = {"a","b","c","d","e","f"};


string textNew="";

int textLen = StringLen(text);

for (int i1=0; i1<textLen; i1=i1+2)
{
string TwoSymbols = StringSubstr(text,i1,2);

for (int i2=0; i2<ArraySize(symbols1); i2++)

{
if (symbols1[i2]==TwoSymbols) {textNew = textNew + symbols2[ i2 ] ; i2=ArraySize(symbols1) ; }

}

}

return (textNew);
}


Теперь она перебирает по 2 символа в строке, например строка 1215 заменится на ab. Но столкнулся с проблемой: функция опускает символы, которых нет в массиве и опускает последний символ, если в строке нечетное количество символов. Помогите пожалуйста изменить функцию так, чтобы строку 1214153 она заменяла бына a14b3. Благодарю!

 
Lians:

Помогите пожалуйста изменить функцию так, чтобы строку 1214153 она заменяла бына a14b3. Благодарю!


Непонятна логика, у тебя ж есть 14 в массиве, т.е. должно быть заменено на "е". С четностью можно нагромоздить, но лучше добавлять нули, т.е. заменить 3 на 03.
 
Lians:

Переделал немного функцию замены символов строки через массивы:


По-моему, вы мудрите чего-то. Если вам необходима функция замены подстрок, можете воспользоваться таким вариантом:

// функция ищет matched_text в строке text и заменяет его на replace_text

string StringReplace(string text, string matched_text, string replace_text)
{
   int pos=StringFind(text,matched_text);
   while(pos>=0)
   {
      if(pos==0) text = StringConcatenate(replace_text,StringSubstr(text,StringLen(matched_text)));
      else text = StringConcatenate(StringSubstr(text,0,pos),replace_text,StringSubstr(text,pos+StringLen(matched_text)));
      pos=StringFind(text,matched_text,pos+StringLen(replace_text));
   }
   return(text);
} 

чуть подправил конец, не сразу обратил внимание на возможность зацикливания

 
Roger:

Непонятна логика, у тебя ж есть 14 в массиве, т.е. должно быть заменено на "е". С четностью можно нагромоздить, но лучше добавлять нули, т.е. заменить 3 на 03.
Оу, сорри, не заметил, тогда допустим 1217153 на a17b3, насчет четности - подойдет вариант с добавлением нулей, сможете так сделать?Ну или пусть опускает последний символ, я так подумал, что это не суть важно.
 
alsu:

По-моему, вы мудрите чего-то. Если вам необходима функция замены подстрок, можете воспользоваться таким вариантом:

Спасибо! Но у меня строки генерируются и замену тоже генерить надо и желательно брать по 2 символа.
 
Скажите как задать временной интервал в котором будут совершаться сделки? (начало времени суток и окончание)
 

Lians:
Оу, сорри, не заметил, тогда допустим 1217153 на a17b3, насчет четности - подойдет вариант с добавлением нулей, сможете так сделать?
string StrReplaceTwo(string text){
 string textMod[] ={""};
 string symbols1[] = {"12","15","19","13","14","16"};

 string symbols2[] = {"a","b","c","d","e","f"};


 string textNew="";

 int textLen = StringLen(text);

 for (int i1=0; i1<textLen; i1=i1+2)
 {
 string TwoSymbols = StringSubstr(text,i1,2);
bool x=true;

 for (int i2=0; i2<ArraySize(symbols1); i2++)

 {
 if (symbols1[i2]==TwoSymbols) {textNew = textNew + symbols2[ i2 ] ; x=false; break;}

 }
if(x) textNew +=StrToInteger(TwoSymbols);
 }

 return (textNew);
 }
Где-то так.
 

Спасибо, но не могу скомпилировать, ругается на строку:

if(x) textNew +=StrToInteger(TwoSymbols);

вот так ругается: '+=' - both operands are to be numeric

как исправить?

 
Lians:

Спасибо, но не могу скомпилировать, ругается на строку:

вот так ругается: '+=' - both operands are to be numeric

как исправить?

Это не работает для строк в MQL4.

if(x) textNew = textNew + StrToInteger(TwoSymbols);
 
Lians:

Спасибо, но не могу скомпилировать, ругается на строку:

вот так ругается: '+=' - both operands are to be numeric

как исправить?

if(x) textNew = textNew + StrToInteger(TwoSymbols);
в mql4 нельзя использовать оператор += для типов string
Причина обращения: