System.StrUtils.ReplaceStr
Delphi
function ReplaceStr(const AText, AFromText, AToText: string): string;
C++
extern PACKAGE System::UnicodeString __fastcall ReplaceStr(const System::UnicodeString AText, const System::UnicodeString AFromText, const System::UnicodeString AToText)/* overload */;
Описание Заменяет все вхождения подстроки в строку, используя поиск с учетом регистра. Используйте ReplaceStr чтобы заменить все вхождения подстроки AFromText со строкой AToText, в строке AText. ReplaceStr возвращает строку, полученные после замены. Используйте ReplaceText сделать без учета регистра замены.
Примечание: Рекурсивные замена подстрок не поддерживается. Это означает, что если замена AToText результаты в новом матче за AFromText, что матч не будет заменен.
для Delphi 7 код
function ReplaceStr(const AText, AFromText, AToText: string): string; {замена подстроки в строке} var I: Integer; Source: string; begin Source := AText; Result := ''; repeat I := Pos(AFromText, Source); if I > 0 then begin Result := Result + Copy(Source, 1, I - 1) + AToText; Source := Copy(Source, I + Length(AFromText), MaxInt); end else Result := Result + Source; until I<= 0; end;
далее идет пример функции преобразования месяца по падежам
массив type TRusCase = (rcImn, rcRod, rcDat, rcVin, rcTvr, rcPrd);
TWordDec=set of char; // разделители слов
из наших функций
получить слово номер
Function GetPosIndex(s:string;index:integer;bkend:TWordDec;len:integer=0):Tpoint; var y,x:integer; s2:string; begin y:=0; s2:=''; result.X:=1; result.y:=0; for X:=1 to length(s) do begin if (ord(s[x])<33) or (s[x] in bkend) or (x=length(s)) then begin if (s2<>'') and ((len=0) or (length(s2)>=len)) then begin y:=y+1; if y=index then begin result.y:=x-result.X; exit; end end; s2:=''; end else begin if s2='' then result.X:=x; s2:=s2+s[x];
end;
end;
end;
Function GetSlovoIndex(s:string;index:integer;bkend:TWordDec;len:integer=0):string; var pr:Tpoint; begin pr:=GetPosIndex(s,index,bkend,len); if pr.X>0 then if pr.y>0 then result:=copy(s,pr.x,pr.y);
end;
и собственно сама функция
function RusCaseMonthName(const Num: Integer; RusCase: TRusCase = rcImn): String; // function result is russion name of month, corresponding number // (Num parameter). You may change Case of Month Name by RusCase parameter // Возвращает русское название месяца по его номеру. Необязательный параметр // RusCase - падеж в котором возвращается результат. По умолчанию именительный // ExtractWord - функция из StrUtils библиотеки RxLibrary, лень было переписывать хорошо работающую функцию. const RootWord: array [1..12] of string = ('Январ', 'Феврал', 'Март', 'Апрел', 'Ма', 'Июн', 'Июл', 'Август','Сентябр', 'Октябр', 'Ноябр', 'Декабр');
AddEnd: array [0..5] of String = ('#-а-у-#-ом-е', 'ь-я-ю-ь-ем-е', 'й-я-ю-й-ем-е', 'ь-я-ю-ь-ем-е', 'ь-я-ю-ь-ем-е', '#-а-у-#-ом-е'); StdEnd: array [1..6] of String = ('ь','я','ю', 'ь', 'ём', 'е'); begin if (Num < 3) or (Num > 8) then Result := RootWord[Num] + StdEnd[Ord(RusCase)+1] else
Result := ReplaceStr(RootWord[Num] + GetSlovoIndex(AddEnd[Num-3],Ord(RusCase)+1, ['-']), '#', ''); end;
пример
procedure TForm1.Button1Click(Sender: TObject); begin edit1.texT:=RusCaseMonthName(3,rcDat); // Марту end;
|