Diskussion zum Artikel "Die Grundlagen von MQL5 Strings" - Seite 2

 
denkir:

...Mich persönlich interessierte die Frage nach der Begrenzung der Zeilenlänge....

Ich habe jetzt experimentiert, 32 MB passen, es würde sogar noch mehr passen, aber es würde sehr lange dauern.
 

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.

In der Tat gibt es Unstimmigkeiten in der Dokumentation. Ich weiß nicht, wie es um den Speicherverbrauch steht, aber ob es schneller ist oder nicht, StringConcatenate() ist VIEL langsamer als StringAdd und +

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


Guter Artikel, ein Muss für alle Anfänger.

[Gelöscht]  
Danke.
 
Guter Artikel, danke.
 

es ist schön, Sie zu ermüden, um uns weniger unwissend zu machen. danke für Ihre Arbeit

 

Fügt der Zeichenkette ein Zifferngruppentrennzeichen hinzu:

//+------------------------------------------------------------------+
//|DelimiterGroupsDigits.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. | |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property script_show_inputs
//--- Externe Parameter
input double Value     =1000000;
input string Delimiter =" "; // Trennzeichen, standardmäßig: " ", Beispiel: 1 000 000.0
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart(void)
  {
   ::Print(DelimiterGroupsDigits(string(Value),Delimiter));
  }
//+------------------------------------------------------------------+
//| Trennzeichen für Zifferngruppen|
//+------------------------------------------------------------------+
string DelimiterGroupsDigits(const string value,const string delimiter=" ")
  {
   string res=value;
   string elements[];
//--- Entfernen Sie die zusätzlichen Zeichen an den Rändern.
   ::StringTrimLeft(res);
   ::StringTrimRight(res);
//--- Prüfung auf eine reelle Zahl
   ushort sep   =::StringGetCharacter(".",0);
   int    total =::StringSplit(res,sep,elements);
//--- Ich habe die Zeichenfolge
   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++;
         //--- Ein Trennzeichen hinzufügen
         if(k>=3 && i>0)
           {
            int array_size=::ArraySize(str);
            ::ArrayResize(str,array_size+1);
            str[array_size]=delimiter;
            k=0;
           }
        }
      //--- Die Zeichenkette sammeln
      res="";
      int elements_total=::ArraySize(str);
      for(int i=elements_total-1; i>=0; i--)
         ::StringAdd(res,str[i]);
      //--- Wenn reelle Zahl
      if(total>1)
         ::StringAdd(res,"."+elements[1]);
     }
//--- Rückgabe des Ergebnisses
   return(res);
  }
//+------------------------------------------------------------------+

//---

Ergebnis:

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

Fügt einer Zeichenkette ein Zifferngruppentrennzeichen hinzu:

Irgendwie kompliziert.
 
fxsaber:
Es ist ziemlich kompliziert.
Werden Sie versuchen, es zu optimieren?
 
Anatoli Kazharski:
Werden Sie versuchen, sie zu optimieren?
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:

Das ist großartig! Und viermal so schnell:

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