//+------------------------------------------------------------------+ //| String.mqh | //| Copyright 2000-2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #include //+------------------------------------------------------------------+ //| Class CString. | //| Appointment: Class-string. | //| Derives from class CObject. | //+------------------------------------------------------------------+ class CString : public CObject { protected: string m_string; public: CString(void); ~CString(void); //--- methods access string Str(void) const { return(m_string); }; uint Len(void) const { return(StringLen(m_string)); }; void Copy(string ©) const; void Copy(CString *copy) const; //--- methods fill bool Fill(const short character) { return(StringFill(m_string,character)); }; void Assign(const string str) { m_string=str; }; void Assign(const CString *str) { m_string=str.Str(); }; void Append(const string str); void Append(const CString *str); uint Insert(const uint pos,const string substring); uint Insert(const uint pos,const CString *substring); //--- methods compare int Compare(const string str) const; int Compare(const CString *str) const; int CompareNoCase(const string str) const; int CompareNoCase(const CString *str) const; //--- methods prepare string Left(const uint count) const; string Right(const uint count) const; string Mid(const uint pos,const uint count) const; //--- methods truncation/deletion int Trim(const string targets); int TrimLeft(const string targets); int TrimRight(const string targets); bool Clear(void) { return(StringInit(m_string)); }; //--- methods conversion bool ToUpper(void) { return(StringToUpper(m_string)); }; bool ToLower(void) { return(StringToLower(m_string)); }; void Reverse(void); //--- methods find int Find(const uint start,const string substring) const; int FindRev(const string substring) const; uint Remove(const string substring); uint Replace(const string substring,const string newstring); protected: virtual int Compare(const CObject *node,const int mode=0) const; }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CString::CString(void) : m_string("") { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CString::~CString(void) { } //+------------------------------------------------------------------+ //| Copy the string value member to copy | //+------------------------------------------------------------------+ void CString::Copy(string ©) const { copy=m_string; } //+------------------------------------------------------------------+ //| Copy the string value member to copy | //+------------------------------------------------------------------+ void CString::Copy(CString *copy) const { copy.Assign(m_string); } //+------------------------------------------------------------------+ //| Add a string to the end | //+------------------------------------------------------------------+ void CString::Append(const string str) { m_string+=str; } //+------------------------------------------------------------------+ //| Add a string to the end | //+------------------------------------------------------------------+ void CString::Append(const CString *str) { //--- check if(!CheckPointer(str)) return; //--- m_string+=str.Str(); } //+------------------------------------------------------------------+ //| Insert a string in specified position | //+------------------------------------------------------------------+ uint CString::Insert(const uint pos,const string substring) { string tmp=StringSubstr(m_string,0,pos); //--- tmp+=substring; m_string=tmp+StringSubstr(m_string,pos); //--- result return(StringLen(m_string)); } //+------------------------------------------------------------------+ //| Insert a string in specified position | //+------------------------------------------------------------------+ uint CString::Insert(const uint pos,const CString *substring) { //--- check if(!CheckPointer(substring)) return(0); //--- string tmp=StringSubstr(m_string,0,pos); //--- tmp+=substring.Str(); m_string=tmp+StringSubstr(m_string,pos); //--- result return(StringLen(m_string)); } //+------------------------------------------------------------------+ //| Comparison with the string | //+------------------------------------------------------------------+ int CString::Compare(const string str) const { if(m_stringstr) return(1); //--- equal return(0); } //+------------------------------------------------------------------+ //| Comparison with the string | //+------------------------------------------------------------------+ int CString::Compare(const CString *str) const { //--- check if(!CheckPointer(str)) return(0); //--- if(m_stringstr.Str()) return(1); //--- equal return(0); } //+------------------------------------------------------------------+ //| Comparison with the string without case | //+------------------------------------------------------------------+ int CString::CompareNoCase(const string str) const { string tmp1,tmp2; //--- tmp1=m_string; tmp2=str; StringToLower(tmp1); StringToLower(tmp2); //--- if(tmp1tmp2) return(1); //--- equal return(0); } //+------------------------------------------------------------------+ //| Comparison with the string without case | //+------------------------------------------------------------------+ int CString::CompareNoCase(const CString *str) const { string tmp1,tmp2; //--- check if(!CheckPointer(str)) return(0); //--- tmp1=m_string; tmp2=str.Str(); StringToLower(tmp1); StringToLower(tmp2); //--- if(tmp1tmp2) return(1); //--- equal return(0); } //+------------------------------------------------------------------+ //| Find occurrences of substring from the specified position | //+------------------------------------------------------------------+ int CString::Find(const uint start,const string substring) const { return(StringFind(m_string,substring,start)); } //+------------------------------------------------------------------+ //| Find last occurrence of substring | //+------------------------------------------------------------------+ int CString::FindRev(const string substring) const { int result,pos=-1; //--- do { result=pos; } while((pos=StringFind(m_string,substring,pos+1))>=0); //--- result return(result); } //+------------------------------------------------------------------+ //| Get a substring consisting of count elements of the left string | //+------------------------------------------------------------------+ string CString::Left(const uint count) const { return(StringSubstr(m_string,0,count)); } //+------------------------------------------------------------------+ //| Get a substring consisting of count elements of the right string.| //+------------------------------------------------------------------+ string CString::Right(const uint count) const { return(StringSubstr(m_string,StringLen(m_string)-count,count)); } //+------------------------------------------------------------------+ //| Get a substring consisting of count elements of the pos string | //+------------------------------------------------------------------+ string CString::Mid(const uint pos,const uint count) const { return(StringSubstr(m_string,pos,count)); } //+------------------------------------------------------------------+ //| Remove from the string, all characters in the begin and | //| in the end if they arein targets, or space, \t,\n or \r | //+------------------------------------------------------------------+ int CString::Trim(const string targets) { return(TrimLeft(targets)+TrimRight(targets)); } //+------------------------------------------------------------------+ //| Remove from the string, all characters in the begin if they are | //| in targets, or space, \t,\n or \r | //+------------------------------------------------------------------+ int CString::TrimLeft(const string targets) { ushort ch; //--- for(int i=0;i=0;i--) { ch=StringGetCharacter(m_string,i); if(ch<=' ') continue; for(int j=0;jj;i--,j++) { ch=StringGetCharacter(m_string,i); StringSetCharacter(m_string,i,StringGetCharacter(m_string,j)); StringSetCharacter(m_string,j,ch); } } //+------------------------------------------------------------------+ //| Remove all occurrences of the substring | //+------------------------------------------------------------------+ uint CString::Remove(const string substring) { int result=0,len,pos=-1; string tmp; //--- len=StringLen(substring); while((pos=StringFind(m_string,substring,pos))>=0) { tmp=StringSubstr(m_string,0,pos); m_string=tmp+StringSubstr(m_string,pos+len); result++; } //--- result return(result); } //+------------------------------------------------------------------+ //| Replace all occurrences of a substring in the specified string | //+------------------------------------------------------------------+ uint CString::Replace(const string substring,const string newstring) { int result=0,len,pos=-1; string tmp; //--- len=StringLen(substring); while((pos=StringFind(m_string,substring,pos))>=0) { tmp=StringSubstr(m_string,0,pos)+newstring; m_string=tmp+StringSubstr(m_string,pos+len); // to eliminate possible loops pos+=StringLen(newstring); result++; } //--- result return(result); } //+------------------------------------------------------------------+ //| Comparison with the string by algorithm | //+------------------------------------------------------------------+ int CString::Compare(const CObject *node,const int mode=0) const { CString *str=(CString*)node; //--- check if(str==NULL) return(0); //--- switch(mode) { case 0: return(Compare(str)); case 1: return(CompareNoCase(str)); } //--- equal return(0); } //+------------------------------------------------------------------+