Discussion de l'article "Les bases de la programmation MQL5 : Les chaînes" - page 2

 
denkir:

...Personnellement, j'étais intéressé par la question des limitations de longueur de ligne....

J'ai fait l'expérience, 32 mb, ça tient, ça tiendrait encore plus, mais ça prendrait beaucoup de temps.
 

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.

En fait, il y a des incohérences dans la documentation. Je ne sais pas ce qu'il en est de l'utilisation de la mémoire, mais pour ce qui est de la rapidité ou non, StringConcatenate() est BEAUCOUP plus lent que StringAdd et +.

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


Bon article, un must pour tous les débutants.

[Supprimé]  
Merci.
 
Bon article, merci.
 

il est agréable de vous fatiguer pour nous rendre moins ignorants. merci pour votre travail

 

Ajoute un séparateur de groupe de chiffres à la chaîne :

//+------------------------------------------------------------------+
//|DelimiterGroupsDigits.mq5 |
//| Copyright 2018, MetaQuotes Software Corp.
//| https ://www.mql5.com
//+------------------------------------------------------------------+
#property script_show_inputs
//--- Paramètres externes
input double Value     =1000000;
input string Delimiter =" "; // Délimiteur, par défaut : " ", exemple : 1 000 000.0
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
void OnStart(void)
  {
   ::Print(DelimiterGroupsDigits(string(Value),Delimiter));
  }
//+------------------------------------------------------------------+
//| Séparateur de groupes de chiffres|
//+------------------------------------------------------------------+
string DelimiterGroupsDigits(const string value,const string delimiter=" ")
  {
   string res=value;
   string elements[];
//--- Supprimer les caractères supplémentaires des bords.
   ::StringTrimLeft(res);
   ::StringTrimRight(res);
//--- Vérifier qu'il s'agit d'un nombre réel
   ushort sep   =::StringGetCharacter(".",0);
   int    total =::StringSplit(res,sep,elements);
//--- Obtention de la chaîne
   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++;
         //--- Ajouter un séparateur
         if(k>=3 && i>0)
           {
            int array_size=::ArraySize(str);
            ::ArrayResize(str,array_size+1);
            str[array_size]=delimiter;
            k=0;
           }
        }
      //--- Recueillir la chaîne de caractères
      res="";
      int elements_total=::ArraySize(str);
      for(int i=elements_total-1; i>=0; i--)
         ::StringAdd(res,str[i]);
      //--- Si nombre réel
      if(total>1)
         ::StringAdd(res,"."+elements[1]);
     }
//--- Retourner le résultat
   return(res);
  }
//+------------------------------------------------------------------+

//---

Résultat :

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

Ajoute un séparateur de groupe de chiffres à une chaîne :

Quelque chose de compliqué.
 
fxsaber:
C'est un peu compliqué.
Allez-vous essayer de l'optimiser ?
 
Anatoli Kazharski:
Allez-vous essayer de l'optimiser ?
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:

C'est très bien ! Et quatre fois plus rapide :

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