Discusión sobre el artículo "Fundamentos de programación en MQL5 - Cadenas de caracteres" - página 2

 
denkir:

...Personalmente, me interesaba la pregunta sobre las limitaciones de longitud de línea....

Ahora he experimentado, caben 32 mb, cabrían aún más, pero llevaría mucho tiempo.
 

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 hecho hay incoherencias en la documentación. No sé sobre el uso de memoria, pero sobre si es más rápido o no, StringConcatenate() es MUCHO más lento que StringAdd y +.

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


Buen artículo, imprescindible para todos los principiantes.

[Eliminado]  
Gracias.
 
Buen artículo, gracias.
 

es agradable cansarte para hacernos menos ignorantes. gracias por tu trabajo

 

Añade un separador de grupo de dígitos a la cadena:

//+------------------------------------------------------------------+
//|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 defecto: " ", ejemplo: 1 000 000.0
//+------------------------------------------------------------------+
//| Función de inicio del 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[];
//--- Elimina los caracteres extra de los bordes.
   ::StringTrimLeft(res);
   ::StringTrimRight(res);
//--- Comprueba si es un número real
   ushort sep   =::StringGetCharacter(".",0);
   int    total =::StringSplit(res,sep,elements);
//--- Tengo la cadena
   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++;
         //--- Añade un separador
         if(k>=3 && i>0)
           {
            int array_size=::ArraySize(str);
            ::ArrayResize(str,array_size+1);
            str[array_size]=delimiter;
            k=0;
           }
        }
      //--- Recoge la cadena
      res="";
      int elements_total=::ArraySize(str);
      for(int i=elements_total-1; i>=0; i--)
         ::StringAdd(res,str[i]);
      //--- Si es un número real
      if(total>1)
         ::StringAdd(res,"."+elements[1]);
     }
//--- Devuelve el resultado
   return(res);
  }
//+------------------------------------------------------------------+

//---

Resultado:

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

Añade un separador de grupos de dígitos a una cadena:

Algo complicado.
 
fxsaber:
Es un poco complicado.
¿Intentarás optimizarlo?
 
Anatoli Kazharski:
¿Intentará optimizarlo?
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:

¡Estupendo! Y cuatro veces más 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