Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.06 c
4-1078985761
Андрей Ш.
2004-03-11 09:16
2004.04.11
Как запретить смену даты.


3-1079539726
Rule
2004-03-17 19:08
2004.04.11
Где скачать обновление IBX 7 чтобы был компонент IBScript?


1-1080105759
Folder
2004-03-24 08:22
2004.04.11
Как программно удалить папку?


14-1082459041
Dmitrij_K
2004-04-20 15:04
2004.04.11
Оконный глюк


14-1079610010
Nikolay M.
2004-03-18 14:40
2004.04.11
LEGALIZE В ЭСТОНИИ - ? :))))





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский