unit fs02iop_00_lib;

interface

Uses
  SysUtils;

Type
  EMyError = class(Exception); //raise EMyError.create('Для вставки новой строки - воспользуйтесь соотв. кнопкой');

Var
  MainDir:string;


//Нормализовать мнемокод
function MnemoCode_Normalize(sMnemo:string):string;
//Заменить в строке заданные символы - на один (заданный)
function Replace_CharsInString(Sx : String;
                               CharsForRepl:String;
                               StrRepl:String=' ';
                               YesIn:boolean=true) : String;
//Замена символов в строке
function ReplaceSymbol(str: string; oldsym, newsym: string): String;
//нормализовать строку для SQL-запроса
function PrepareForSQL(Str: String): String;
//Удалить лишние (заданные) символы из строки (2 и более)
function String_ExcessChar_Delete(Sx : String; Ch:char) : String;
//Удалить лишние пробелы из строки (2 и более)
function String_ExcessSpace_Delete(Sx : String) : String;
//Конвертировать String в BOOLEAN
function spStrToBool(Sx: String; Def: boolean=false) : boolean;
//аналог стандартной функции IfThen (StrUTILS)
function IfThen(V:boolean;sTrue:string='true';sFalse:string='false'):string;

//Получить слово из строки Sx по номеру NumWord. UnChar - множество разделителей
function Get_Word_From_String(Sx : String; NumWord : integer; UnChar: String=' '; YesAllTrim_Before: boolean=true) : String;
//Определить кол-во слов в строке Sx. UnChar - множество разделителей
function Get_CountWords_In_String(Sx : String; UnChar: String=' '; YesAllTrim_Before: boolean=true) : integer;
//округление
function RoundTo(V:extended;iRoundTo:integer=2):extended;


implementation

function MnemoCode_Normalize(sMnemo:string):string;
//Нормализовать мнемокод
begin
  Result:='';
  sMnemo:=trim(sMnemo);
  if sMnemo<>'' then begin
     Result := ReplaceSymbol(sMnemo, #9, #32);
     Result := ReplaceSymbol(Result, #39, #32);
     Result := ReplaceSymbol(Result, '"', #32);
     Result := ReplaceSymbol(Result, '`', #32);
     Result:=trim(String_ExcessSpace_Delete(Result));
     Result:=trim(Replace_CharsInString(Result,
                                        //#32+#39+'~`"!@#$%^&*+={}[]\|/?><.,',
                                        #32+'~!@#$%^&*+={}[]\|/?><.,',
                                        '_',
                                        true));
     Result := ReplaceSymbol(Result, '№', 'N');
     Result := ReplaceSymbol(Result, 'ё', 'е');
     Result := ReplaceSymbol(Result, 'Ё', 'Е');
     Result := trim(Result);
  end;
end;

function Replace_CharsInString(Sx : String;
                               CharsForRepl:String;
                               StrRepl:String=' ';
                               YesIn:boolean=true) : String;
//Заменить в строке заданные символы - на один (заданный)
Var
  i : integer;
begin
  Result:='';
  if (length(Sx)>0) and (length(CharsForRepl)>0) and (length(StrRepl)>0) then begin
     for i:=1 to length(Sx) do
      begin
        if POS((Sx[i]),CharsForRepl)>0 then begin
           if YesIn then begin
              Result:=Result+StrRepl; //заменяем
           end
           else begin
              Result:=Result+Sx[i];
           end;
        end
        else begin
           if YesIn then begin
              Result:=Result+Sx[i];
           end
           else begin
              Result:=Result+StrRepl; //заменяем
           end;
        end;
     end;
  end;
end;

function String_ExcessChar_Delete(Sx : String; Ch:char) : String;
//Удалить лишние (заданные) символы из строки (2 и более)
Var
  N: integer;
begin
  Result:=trim(Sx);
  N:=1;
  while N>0 do
   begin
    N:=POS(Ch+Ch, Result);
    if N>0 then begin
       Result:=trim(ReplaceSymbol(Result, Ch+Ch, Ch));
    end;
  end;
end;
function String_ExcessSpace_Delete(Sx : String) : String;
//Удалить лишние пробелы из строки (2 и более)
begin
  Result:=trim(String_ExcessChar_Delete(Sx, #32));
end;

function PrepareForSQL(Str: String): String;
//нормализовать строку для SQL-запроса
begin
  Result := ReplaceSymbol(Str, '''', '''''');
end;
function ReplaceSymbol(str: string; oldsym, newsym: string): String;
//Замена символов в строке
var i, j: integer;
  repstr, R: string;
  s1, s2: String;
begin
  s1 := oldsym;
  s2 := Str;
  i := pos(s1, s2);
  if i > 0 then begin
    R := '';
    RepStr := Str;
    while i > 0 do begin
      R := R + copy(Repstr, 1, i - 1) + newsym;
      repstr := copy(repstr, i + length(oldsym), length(Repstr));
      i := pos(oldsym, Repstr);
    end;
    Result := R + RepStr;
  end else
    Result := Str;
end;


function spStrToBool(Sx: String; Def: boolean=false) : boolean;
//Конвертировать String в BOOLEAN
begin
 Result:=FALSE;
 Sx:=Trim(Sx);
 if Length(Sx)>0 then begin
    Sx:=AnsiUpperCase(Sx);
    if Sx='Y'    then Result:=TRUE;
    if Sx='YES'  then Result:=TRUE;
    if Sx='YE'   then Result:=TRUE;
    if Sx='Д'    then Result:=TRUE;
    if Sx='ДА'   then Result:=TRUE;
    if Sx='TRUE' then Result:=TRUE;
    if Sx='T' then Result:=TRUE;
    if Sx='ИСТИНА' then Result:=TRUE;
    //if Sx='1' then Result:=TRUE;
    if not Result then begin
       if StrToIntDef(Trim(Sx),0)>0 then Result:=true;
    end;
 end
 else begin
    Result:=Def;
 end;
end;


function Get_Word_From_String(Sx : String; NumWord : integer; UnChar: String=' '; YesAllTrim_Before: boolean=true) : String;
//Получить слово из строки Sx по номеру NumWord. UnChar - множество разделителей
//YesAllTrim_Before - если TRUE, то перед анализом удалить из строки левые и правые пробелы
Var
  InWord    : byte;
  NumWordCur, i : integer;
begin
  Result:='';
  if YesAllTrim_Before then Sx:=trim(Sx);
  if length(Sx)>0 then begin
     if NumWord>0 then begin
        InWord := 0;
        NumWordCur:=0;
        i:=0;
        while i<length(Sx) do
         begin
          i:=i+1;
          if POS(Sx[i],UnChar)<=0 then begin //этот символ - НЕ разделитель
             if InWord<=0 then NumWordCur:=NumWordCur+1; //мы - на начале слова
             InWord:=1; //Мы внутри слова
             if NumWordCur=NumWord then begin //Это - наше слово
                Result:=Result+Sx[i];   //и мы его выдираем из строки
             end;
          end
          else begin  //этот символ - разделитель
             InWord:=0; //Мы снаружи слова
             if NumWordCur=NumWord then begin //Это было - наше слово
                i:=length(Sx)+1; //поэтому, выходим из цикла и функции
             end;
          end;
        end;
     end;
  end;
end;

function Get_CountWords_In_String(Sx : String; UnChar: String=' '; YesAllTrim_Before: boolean=true) : integer;
//Определить кол-во слов в строке Sx. UnChar - множество разделителей
var
  InWord : byte;
  i : integer;
begin
  Result:=0;
  if YesAllTrim_Before then Sx:=trim(Sx);
  if length(Sx)>0 then begin
     InWord := 0;
     i:=0;
     while i<length(Sx) do
      begin
       i:=i+1;
       if POS(Sx[i],UnChar)<=0 then begin //этот символ - НЕ разделитель
          if InWord<=0 then Result:=Result+1; //переход на начало слова
          InWord:=1; //Мы внутри слова
       end
       else begin //этот символ - разделитель
          InWord:=0; //Мы снаружи слова
       end;
     end;
  end;
end;

function IfThen(V:boolean;sTrue:string='true';sFalse:string='false'):string;
//аналог стандартной функции IfThen (StrUTILS)
begin
  sTrue:=trim(sTrue);
  sFalse:=trim(sFalse);
  if length(sTrue)<=0 then sTrue:='true';
  if length(sFalse)<=0 then sFalse:='false';
  if V then begin
     Result:=sTrue;
  end
  else begin
     Result:=sFalse;
  end;
end;


function iPower_10(N:integer):int64;
//Вспомогательная для RoundTo
//вычисление 10 в степени N (без проверок на переполнение)
Var
  i:integer;
begin
  Result:=0;
  if n>0 then begin
     Result:=1;
     for i:=1 to N do
      begin
        Result:=Result*10;
     end;
  end;
end;

function RoundTo(V:extended;iRoundTo:integer=2):extended;
//округление
Var
  Sx:string;
  N,iRes : int64;
begin
  Result:=V;
  if iRoundTo>0 then begin
     N:=iPower_10(iRoundTo);
     if N>0 then begin
        iRes:=round(Result*N);
        Result:=iRes/N;
     end;
  end
  else begin
     Result:=round(V);
  end;
end;


end.