Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизЗамена символа в строке Найти похожие ветки
← →
Last_s (2004-03-26 09:57) [0]Доброго времени суток! Со строками работал мало поэтому прошу прощения за такой вопрос. Как в строке заменить один символ другим. Мне конкретно надо, чтобы вместо строки времени "01:45" было "01,45". Порылся в helpe, функцию замены не нашел. Может плохо смотрел?
← →
Axis_of_Evil © (2004-03-26 09:59) [1]да хотя бы Str[Pos(...)] := ...
← →
rimd © (2004-03-26 10:05) [2]str:string;
str:="01:45";
Str[3]:=",";
вот и все
← →
Last_S (2004-03-26 10:08) [3]Да понятно, но а если будет "145:23". Дело в том что это строка разность значений времени
← →
Infom © (2004-03-26 10:10) [4]Str[Pos(":")] :=",";
← →
Asdor © (2004-03-26 10:13) [5]А может StringReplace ?
← →
rimd © (2004-03-26 10:16) [6]Когда-нибудь и ленивым приходится трудиться ручками
← →
PVOzerski © (2004-03-26 12:06) [7]>Str[Pos(":")] :=",";
Тогда уж Str[Pos(":",Str)] :=",";
И то, если двоеточия в строке нет вообще, ошибка доступа возникнет, в лучшем случае (если строка "короткая") исказится информация о ее длине.
← →
zamkom © (2004-03-26 12:28) [8]Полностью согласен с Asdor © (26.03.04 10:13) [5] используй
S:="145:23";
StringReplace(S,":",",",[rfReplaceAll]);
Получиться как ты хочеш 145,23.
← →
rimd © (2004-03-26 12:29) [9]Ind:=Pos(":",Str)
if Ind>0 then
Str[Ind]:=",";
← →
Fay © (2004-03-26 14:03) [10]for, F1
← →
Serginio666 (2004-03-26 17:24) [11]Сейчас для тестов сделал фукцию замены т.к. StringReplace совсем запарилас. Конечно легко сделать и через алгоритм Боуера - Мура но в задачу это не входило.
Может сгодится.class function TStringHalper.LageStringReplaceALL(S, OldPattern, NewPattern: string): String;
var
IndexArray:Array of integer;
LengthIndexArray,CountIndex:Integer;
P: PChar;
LenOldPattern,LenNewPattern: Cardinal;
i:Integer;
SeachChar:Pchar;
CounEquls:Integer;
CopyCount,PosOldPatern,IndexInResult,IndexInOrigString:Integer;
begin
SetLength(IndexArray,128);
LengthIndexArray:=128;
CountIndex:=0;
CounEquls:=0;
Result := "";
LenOldPattern := Length(OldPattern);
p:=Pchar(s);
SeachChar:=Pchar(OldPattern);
For i:=1 To Length(s) Do
Begin
if p^=SeachChar^ then
Begin
inc(CounEquls);
inc(SeachChar);
If CounEquls=LenOldPattern Then
Begin
if CountIndex= LengthIndexArray Then
Begin
LengthIndexArray:=LengthIndexArray*2;
SetLength(IndexArray,LengthIndexArray);
end;
IndexArray[CountIndex]:=Cardinal(P)-Cardinal(S)-LenOldPattern+2;
Inc(CountIndex);
SeachChar:=Pchar(OldPattern);
CounEquls:=0;
end;
end
Else
begin
SeachChar:=Pchar(OldPattern);
CounEquls:=0;
end;
Inc(p);
end;
if CountIndex=0 Then
Begin
result:=s;
exit;
end;
LenNewPattern:=Length(NewPattern);
SetLength(result,length(s)+(LenNewPattern-LenOldPattern)*CountIndex);
IndexInResult:=1;
IndexInOrigString:=1;
For i:=0 To CountIndex-1 Do
Begin
PosOldPatern:= IndexArray[i];
if IndexInOrigString<>PosOldPatern Then
Begin
CopyCount:=PosOldPatern-IndexInOrigString;
Move(S[IndexInOrigString],Result[IndexInResult],CopyCount);
IndexInOrigString:=PosOldPatern;
Inc(IndexInResult,CopyCount);
End;
Move(NewPattern[1],Result[IndexInResult],LenNewPattern);
Inc(IndexInOrigString,LenOldPattern);
Inc(IndexInResult,LenNewPattern);
end;
if Length(S)>IndexInOrigString Then
move(S[IndexInOrigString],Result[IndexInResult],Length(S)-IndexInOrigString+1);
//end;
end;
← →
Serginio666 (2004-03-26 17:28) [12]Вернее этот вариант поерасивее
class function TStringHalper.LageStringReplaceALL(S, OldPattern, NewPattern: string): String;
var
IndexArray:Array of integer;
LengthIndexArray,CountIndex:Integer;
P,FistOldPatern: PChar;
LenOldPattern,LenNewPattern: Cardinal;
i:Integer;
SeachChar:Pchar;
CounEquls:Integer;
CopyCount,PosOldPatern,IndexInResult,IndexInOrigString:Integer;
begin
SetLength(IndexArray,128);
LengthIndexArray:=128;
CountIndex:=0;
CounEquls:=0;
Result := "";
LenOldPattern := Length(OldPattern);
FistOldPatern:=Pchar(OldPattern);
p:=Pchar(s);
SeachChar:=Pchar(OldPattern);
For i:=1 To Length(s) Do
Begin
if p^=SeachChar^ then
Begin
inc(CounEquls);
inc(SeachChar);
If CounEquls=LenOldPattern Then
Begin
if CountIndex= LengthIndexArray Then
Begin
LengthIndexArray:=LengthIndexArray*2;
SetLength(IndexArray,LengthIndexArray);
end;
IndexArray[CountIndex]:=Cardinal(P)-Cardinal(S)-LenOldPattern+2;
Inc(CountIndex);
SeachChar:=FistOldPatern;
CounEquls:=0;
end;
end
Else
begin
SeachChar:=FistOldPatern;
CounEquls:=0;
end;
Inc(p);
end;
if CountIndex=0 Then
Begin
result:=s;
exit;
end;
LenNewPattern:=Length(NewPattern);
SetLength(result,length(s)+(LenNewPattern-LenOldPattern)*CountIndex);
IndexInResult:=1;
IndexInOrigString:=1;
For i:=0 To CountIndex-1 Do
Begin
PosOldPatern:= IndexArray[i];
if IndexInOrigString<>PosOldPatern Then
Begin
CopyCount:=PosOldPatern-IndexInOrigString;
Move(S[IndexInOrigString],Result[IndexInResult],CopyCount);
IndexInOrigString:=PosOldPatern;
Inc(IndexInResult,CopyCount);
End;
Move(NewPattern[1],Result[IndexInResult],LenNewPattern);
Inc(IndexInOrigString,LenOldPattern);
Inc(IndexInResult,LenNewPattern);
end;
if Length(S)>IndexInOrigString Then
move(S[IndexInOrigString],Result[IndexInResult],Length(S)-IndexInOrigString+1);
//end;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c