Discussão do artigo "Fundamentos básicos da programação MQL5: Strings" - página 2

 
denkir:

...Pessoalmente, eu estava interessado na pergunta sobre limitações de comprimento de linha....

Fiz um experimento agora, 32 MB cabem, caberia ainda mais, mas levaria muito tempo.
 

According to the description of these functions in MQL5 Reference, they allow us to add up strings in a more space efficient (in terms of the occupied working memory) and faster way.

De fato, há incoerência na documentação. Não sei sobre o uso de memória, mas sobre ser mais rápido ou não, StringConcatenate() é MUITO mais lento que StringAdd e +

2013.04.11 19:09:48    teststring (EURUSD,M1)    time for 'StringConcatenate(c,a,b)' = 1170 milliseconds, i = 1000000
2013.04.11 19:09:47    teststring (EURUSD,M1)    time for 'StringAdd(a,b)' = 94 milliseconds, i = 1000000
2013.04.11 19:09:47    teststring (EURUSD,M1)    time for 'c = a + b' = 265 milliseconds, i = 1000000


Bom artigo, obrigatório para todos os iniciantes.

[Excluído]  
Obrigado.
 
Bom artigo, obrigado.
 

é bom cansá-lo para nos tornar menos ignorantes. obrigado por seu trabalho

 

Adiciona um separador de grupo de dígitos à cadeia de caracteres:

//+------------------------------------------------------------------+
//|DelimiterGroupsDigits.mq5 |
//| Copyright 2018, MetaQuotes Software Corp.
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property script_show_inputs
//--- Parâmetros externos
input double Value     =1000000;
input string Delimiter =" "; // Delimitador, por padrão: " ", exemplo: 1 000 000.0
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart(void)
  {
   ::Print(DelimiterGroupsDigits(string(Value),Delimiter));
  }
//+------------------------------------------------------------------+
//| Separador de grupos de dígitos|
//+------------------------------------------------------------------+
string DelimiterGroupsDigits(const string value,const string delimiter=" ")
  {
   string res=value;
   string elements[];
//--- Remova os caracteres extras das bordas.
   ::StringTrimLeft(res);
   ::StringTrimRight(res);
//--- Verificar se há um número real
   ushort sep   =::StringGetCharacter(".",0);
   int    total =::StringSplit(res,sep,elements);
//--- Obteve a string
   if(total>0)
     {
      string str[];
      int length=::StringLen(elements[0]);
      for(int k=0,i=length-1; i>=0; i--)
        {
         int size=::ArraySize(str);
         ::ArrayResize(str,size+1);
         str[size]=::StringSubstr(elements[0],i,1);
         k++;
         //--- Adicionar um separador
         if(k>=3 && i>0)
           {
            int array_size=::ArraySize(str);
            ::ArrayResize(str,array_size+1);
            str[array_size]=delimiter;
            k=0;
           }
        }
      //--- Coleta a string
      res="";
      int elements_total=::ArraySize(str);
      for(int i=elements_total-1; i>=0; i--)
         ::StringAdd(res,str[i]);
      //--- Se for um número real
      if(total>1)
         ::StringAdd(res,"."+elements[1]);
     }
//--- Retorna o resultado
   return(res);
  }
//+------------------------------------------------------------------+

//---

Resultado:

1 000 000.0
10,000,000.0
100'000'000.0
10 000.545
 
Anatoli Kazharski:

Adiciona um separador de grupo de dígitos a uma cadeia de caracteres:

De alguma forma complicado.
 
fxsaber:
É um pouco complicado.
Você tentará otimizá-lo?
 
Anatoli Kazharski:
Você tentará otimizá-lo?
string ModToString( ulong &Num, const int Mod = 1000, const int Len = 3 )
{
  const string Res = ((bool)(Num / Mod) ? IntegerToString(Num % Mod, Len, '0') : (string)(Num % Mod));
  
  Num /= Mod;
  
  return(Res);
}

string NumToString( ulong Num, const string Delimeter = " " )
{
  string Res = ModToString(Num);

  while (Num)
    Res = ModToString(Num) + Delimeter + Res;

  return(Res);
}

string NumToString( double Num, const int digits = 8, const string Delimeter = NULL )
{
  const string PostFix = (Num < 0) ? "-" : NULL;
  
  Num = MathAbs(Num);
    
  return(PostFix + NumToString((ulong)Num, Delimeter) + StringSubstr(DoubleToString(Num - (long)Num, digits), 1));
}

void OnStart()
{
  Print(NumToString(1234567.89, 2, " "));
}
 
fxsaber:

Isso é ótimo! E quatro vezes mais rápido:

void OnStart(void)
  {
   long count=10000000;
   uint start=GetTickCount();
   for(int i=0; i<count && !IsStopped(); i++)
      DelimiterGroupsDigits(string(Value),Delimiter);

   uint end=GetTickCount()-start;
   Print("01 > ms: ",end,"; res: ",DelimiterGroupsDigits(string(Value),Delimiter));
//---
   start=GetTickCount();
   for(int i=0; i<count && !IsStopped(); i++)
      NumToString(Value,2,Delimiter);

   end=GetTickCount()-start;
   Print("02 > ms: ",end,"; res: ",NumToString(Value,2,Delimiter));
  }

//---

2018.01.30 21:02:15.996 01 > ms: 19047; res: 1 000 000.0
2018.01.30 21:02:20.683 02 > ms: 4688; res: 1 000 000.00