Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.13;
Скачать: CL | DM;

Вниз

Удалить ненужные пробелы   Найти похожие ветки 

 
download   (2004-06-02 03:12) [0]

Уважаемые мастера, подскажите, как удалить ненужные пробелы в тексте, двойные, тройные и т.д.


 
Andy BitOff ©   (2004-06-02 03:22) [1]


a:=0;
repeat
 if (str[a]=" ") and (str[a+1]=" ") then delete(str,a,1)
 inc(a);
until a=Length(str);


 
Andy BitOff ©   (2004-06-02 03:25) [2]

Хотя я сейчас подумал...
По идее, если пробел в конце строки, то исключение на str[a+1] отсюда вывод
str:=Trim(str);


 
default ©   (2004-06-02 03:26) [3]

function DeleteBackspace(const S: String): String;
var
 i, CountBs: Cardinal;
begin
 CountBs := 0;
 SetLength(Result, Length(S));
 for i := 1 to Length(S) do
 if S[i] <> " " then Result[i] := S[i] else Inc(CountBs);
 SetLength(Result, Length(S) - CountBs)
end;


 
default ©   (2004-06-02 03:31) [4]

опс..вот так
function DeleteBackspace(const S: String): String;
var
 i, CountBs, Index: Cardinal;
begin
 CountBs := 0;
 Index := 1;
 SetLength(Result, Length(S));
 for i := 1 to Length(S) do
 if S[i] <> " " then begin
  Result[Index] := S[i];
  Inc(Index)
 end else Inc(CountBs);
 SetLength(Result, Length(S) - CountBs)
end;


 
lyeh ©   (2004-06-02 03:53) [5]

Если пробелы по краям, то Trim()


 
try   (2004-06-02 06:38) [6]

>default ©   (02.06.04 03:31) [4]
Все пробеллы удаляет


 
try   (2004-06-02 06:46) [7]

>Andy BitOff ©   (02.06.04 03:22) [1]
Не правильно работает - проверьте


 
Kair ©   (2004-06-02 06:49) [8]

С потолка (никак не проверено; написал в реальном времени):


while Pos(#32 + #32, S) > 0 do
Delete(S, Pos(#32 + #32, S), 1);


Щас проверю... :)


 
Думкин ©   (2004-06-02 06:54) [9]


> default ©   (02.06.04 03:31) [4]
> опс..вот так

Можно поправить его:

function DeleteBackspace(const S: String): String;
var
 i, CountBs, Index: Cardinal;
 a : boolean;begin
 CountBs := 0;
 Index := 1;
 SetLength(Result, Length(S));
 a := true;
 for i := 1 to Length(S) do
  if (S[i] <> " ")or(a) then begin
   Result[Index] := S[i];
   Inc(Index);
   a := (S[i] <> " ")
  end else Inc(CountBs);
 SetLength(Result, Length(S) - CountBs);
 Result := Trim(Result)
end;


 
Kair ©   (2004-06-02 06:55) [10]

Ага, проверил... Вроде работает...


 
Andy BitOff ©   (2004-06-02 06:56) [11]

Ну хорошо.
Наверно так будет правильнее:

str:=Trim(str);
a:=0;
repeat
if (str[a]=" ") and (str[a+1]=" ") then delete(str,a,1)
else inc(a);
until a=Length(str);


 
jack128 ©   (2004-06-02 06:58) [12]

// удаляет ведущие и ведомые пробелы и заменяет все парные пробелы на один..
fucntion PackString(s: string): string;
var
 LastChar: Char;
 Index, i: Integer;
begin
 LastChar := #32;
 Index := 1;
 SetLength(Result, Length(s));
 for i := 1 to Length(Result) do
 begin
   if (LastChar = #32) and (s[i] = #32) then Continue;
   LastChar := s[i];
   Result[Index] := LastChar;
   inc(Index);
 end;
 if Result[Index - 1] = #32 then Dec(Index);
 SetLength(Result, Index);
end;


зы не тестированно


 
TUser ©   (2004-06-02 06:59) [13]

while pos("  ",input)>0 do
  StringReplace(input,"  "," ",[rfReplaceAll]);


 
Думкин ©   (2004-06-02 07:00) [14]

> Andy BitOff ©   (02.06.04 06:56) [11]

а выйти за границу не боишься?


 
Andy BitOff ©   (2004-06-02 07:03) [15]

Думкин ©   (02.06.04 07:00) [14]
Нет.


 
jack128 ©   (2004-06-02 07:08) [16]


> Andy BitOff ©   (02.06.04 07:03)
> Думкин ©   (02.06.04 07:00) [14]
> Нет.
нечего супер страшного не будет, но не есть сие красиво..
зы помним, что по MyString[Length(MyString)+1] находится завершающий ноль..


 
Думкин ©   (2004-06-02 07:09) [17]

> Andy BitOff ©   (02.06.04 07:03) [15]

Str[0] -?
Str[length(Str)+1] -?


 
Andy BitOff ©   (2004-06-02 07:17) [18]

Str[0] - привычка с ассемблера осталась. Если очень надо, то единичку поставить не сложно. ;)
Str[length(Str)+1] - по умолчанию компилятор не до конца вычисляет условие, поэтому Str[length(Str)+1] никогда не произойдет. Не зря же Trim поставлен.


 
Думкин ©   (2004-06-02 07:20) [19]

> Andy BitOff ©   (02.06.04 07:17) [18]
> Str[length(Str)+1] - по умолчанию компилятор не до конца
вычисляет условие,

оно конечно, но по умолчанию все-таки, в этом случае для переносимости надо в директивы заключать.


 
Andy BitOff ©   (2004-06-02 07:25) [20]

Согласен. =)

Но вопрос звучал;
Уважаемые мастера, подскажите, как удалить ненужные пробелы в тексте, двойные, тройные и т.д.

Я подсказал. Так сказать, направил на путь истинный, а дальше уж ...


 
download   (2004-06-03 03:07) [21]

Большое спасибо. Вы меня очень выручили!


 
Sur   (2004-06-03 10:22) [22]

function DelSpace(const Text: String): String;
var
 P: Integer;
begin
   Result := Text;
   repeat
        P := Pos(" ",Result);
        if P <> 0 then Delete(Result,P,1)
   until P = 0
end;


 
Amoeba ©   (2004-06-03 11:05) [23]

Готовые ф-ии есть в бесплатной с исходниками библиотеке QStrings (если память не изменяет, то они написаны на asm"е).



Страницы: 1 вся ветка

Текущий архив: 2004.06.13;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.03 c
9-1075784484
VolanD2002
2004-02-03 08:01
2004.06.13
*.mdl в Delphi


1-1086073396
DmitryNekl
2004-06-01 11:03
2004.06.13
Как вывести название типа?


14-1085311405
VMcL
2004-05-23 15:23
2004.06.13
Голосование "Образование программиста?"


3-1084973834
Gennadiy
2004-05-19 17:37
2004.06.13
Как сделать для IBQuery чтото типа свойства ReadOnly??


1-1085809932
Eugene
2004-05-29 09:52
2004.06.13
Максимальное раскрытие и восстановление окна