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

Вниз

Есть ли Trim для всей строки, а не для краев?   Найти похожие ветки 

 
Kolan ©   (2010-01-22 16:57) [0]

Здравствуйте!

Есть ли встроенная функция для удаления дублирующихся пробелов во всей строке?


 
turbouser ©   (2010-01-22 17:01) [1]


> Kolan ©   (22.01.10 16:57)  

while AnsiPos("  ", Str)>0 do
 Str:=StringReplace(Str,"  "," ",[rfReplaceall])

и всех делов..


 
Kolan ©   (2010-01-22 17:05) [2]

Почему Ansi? И это не совсем то что я хотел.


 
Игорь Шевченко ©   (2010-01-22 17:21) [3]

Что такое "дублирующиеся пробелы" ?


 
MBo ©   (2010-01-22 17:32) [4]


procedure RemoveTrailingAndStartingSpacesAndZipInnerSpaces(var s: string);
var
 Len, i, j: Integer;
 RemoveSpace: Boolean;
begin
 Len := Length(s);
 j := 0;
 RemoveSpace := True;
 for i := 1 to Len do begin
   if s[i] = " " then
     if RemoveSpace then
       Inc(j)
     else begin
       RemoveSpace := True;
       s[i - j] := s[i];
     end
   else begin
     RemoveSpace := False;
     s[i - j] := s[i];
   end;
 end;
 SetLength(s, Len - j - Ord(RemoveSpace));
end;


 
Игорь Шевченко ©   (2010-01-22 17:54) [5]

MBo ©   (22.01.10 17:32) [4]

Приз за имя


 
Smile   (2010-01-22 18:05) [6]

Есть ли встроенная функция для удаления дублирующихся пробелов во всей строке?

И это не совсем то что я хотел.

Расскажи своей бабушке то, что ты хотел. Возможно она изложит твой вопрос более понятно))


 
KilkennyCat ©   (2010-01-22 18:12) [7]


> MBo ©   (22.01.10 17:32) [4]
>
>
> procedure RemoveTrailingAndStartingSpacesAndZipInnerSpaces(var
> s: string

s как-то скромно. Нужно было назвать "аэтопеременнаячерезкоторуюпередаетсястрокагдебудутудалятьсяпробелы"


 
Германн ©   (2010-01-22 18:17) [8]


> Приз за имя


А такая процедура работала бы лучше!
procedure RemoveTrailingAndStartingSpacesAnd7ZipInnerSpaces


 
clickmaker ©   (2010-01-22 18:21) [9]

> Нужно было назвать "аэтопеременнаячерезкоторуюпередаетсястрокагдебудутуда
> лятьсяпробелы"

var аэтобудетпараметромфункцииRemoveTrailingAndStartingSpacesAndZipInnerSpacesчерезк оторыйпередаетсястрокагдебудутудалятьсяпробелы: string;

аэтобудетпараметромфункцииRemoveTrailingAndStartingSpacesAndZipInnerSpacesчерезк оторыйпередаетсястрокагдебудутудалятьсяпробелы := "что-то    много  тут    пробелов";

аэтострокаужебезпробелов := RemoveTrailingAndStartingSpacesAndZipInnerSpaces(аэтобудетпараметромфункцииRemov eTrailingAndStartingSpacesAndZipInnerSpacesчерезкоторыйпередаетсястрокагдебудуту далятьсяпробелы);

PS. Широкоформатный монитор поможет сделать ваш код более понятным, когда за него сядет пришедший на ваше место другой программист.


 
MBo ©   (2010-01-22 18:25) [10]

>Приз за имя
Самому понравилось ;)


 
Anatoly Podgoretsky ©   (2010-01-22 19:44) [11]

> Kolan  (22.01.2010 17:05:02)  [2]

Еще один недовольный.


 
Kolan ©   (2010-01-23 09:28) [12]

Спасибо ребята, конечно, но задача не решена. Я просил встроенную функцию из VCL или сообщение об её отсутствии.

Дублирующиеся пробелы, Игорь, это когда не одни пробел, а несколько. Больше одного то есть.

Я, Анатолий, не недоволен, я удивлен ответам.

Smile, лучше я скажу тебе куда тебе пойти.


 
Kolan ©   (2010-01-23 09:30) [13]

Да, тему обсуждение можно закрывать, так как по косвенным признакам очевидно, что такой функции нет.

P. S.
Задачу решил регулярным выражением.


 
KilkennyCat ©   (2010-01-23 09:57) [14]


> очевидно, что такой функции нет.

противоречит

> решил регулярным выражением.


 
Kolan ©   (2010-01-23 09:58) [15]

Регулярные выражения — это сторонний класс.


 
KilkennyCat ©   (2010-01-23 10:43) [16]

В каком смысле? Его отдельно доустанавливать надо? Так и строковые функции многие написаны сторонне, далеко не апишные.


 
Kolan ©   (2010-01-23 11:15) [17]

Да его нужно устанавливать, TRegExpr называется.


 
Andy BitOff ©   (2010-01-23 12:13) [18]

> Kolan ©   (23.01.10 11:15) [17]

Это несомненно лучше, чем написать две строчки кода.


 
Kolan ©   (2010-01-23 12:24) [19]

Несомненно, так как в этом случае строчка одна.


 
sniknik ©   (2010-01-23 12:41) [20]

2 строчки исключительно для форматирования, чтобы человеку читать удобнее было... напиши в одну. или разнеси функции форматирования (а это именно функции/подпрограмма хотя и в строке) регекспа на разные строки, чтобы в равных условиях оценивать.
и в чем разница?
кроме того конечно, что регэкспом немного дольше будет работать.


 
Anatoly Podgoretsky ©   (2010-01-23 14:08) [21]

> Kolan  (23.01.2010 09:30:13)  [13]

StringReplace это супер функция, на CompactSpaces


 
Дмитрий Белькевич   (2010-01-23 14:45) [22]

Такая еще есть


function DelSpace1(const S: String): String;
var
I: Integer;
begin
Result := S;
for I := Length(Result) downto 2 do
 if (Result[I] = " ") and (Result[I - 1] = " ") then
  Delete(Result, I, 1);
end;


Правда, неоптимальная по скорости. Но компактная.


 
Kolan ©   (2010-01-23 14:52) [23]

sniknik, так всю программу можно в строчку вместить :).
Я не хочу писать свою реализацию даже из двух строчек.

Что такое CompactSpaces, Анатолий?

Дмитрий, спасибо, но я спрашивал про готовое.

---
Неужели, ребята, вы думаете, что я не в состоянии написать такую функцию и пришел сюда за кодом?


 
turbouser ©   (2010-01-23 14:56) [24]


> Kolan ©   (23.01.10 14:52) [23]


> я спрашивал про готовое.

так StringReplace и есть готовое..


 
Kolan ©   (2010-01-23 15:03) [25]

turbouser, научите меня как оформить вызов, чтобы он съел переменное количество пробелов в середине. Например в такой строке: "I have    no  idea        of how StringReplace   can help me delete all       this  spaces."


 
turbouser ©   (2010-01-23 15:04) [26]


> Kolan ©

[1]


 
Kolan ©   (2010-01-23 15:19) [27]

turbouser, мне кажется или там еще цикл есть?

А если мне не кажется, то очевидно, когда я захочу воспользоваться этой функцией дважды мне нужно будет оформить её в виде библиотечной, иначе не избежать дублирующегося кода. Так что там целых пять строк.

А мне нужна встроенная функция. Встроенная понимаете? Чтобы одной строкой вызвал, вот так например: AHistoryList.Text := ReplaceRegExpr("\s{2,}", Answer,  #13#10, False); и всё?

Это же элементарно. StringReplace — встроенная, а StringReplace с циклом, интерфейсом и бегин-эндом — это не встроенная, это самодельная. Она конечно сделана из встроенной, но все равно самодельная.

То есть, если не понятно, я хотел у вас узнать есть ли в VCL встроенная функция для удаления пробелов во всей строке или нет.

То есть, вот именно встроенная, и именно в VCL. И чтобы вызывать можно было одной строкой. Типа как Trim (я ясно выражаюсь?), но только для все строки, а не только для краёв.

И чтобы больше ничего не нужно было для её вызова, просто так вот сказал: эй, а УдалиКаМнеВсеПробелы(S) и она — бац и удалила.

И чтобы без цикла, turbouser. И без условий. понимаете Дмитрий? И без крутых названий, MBo. А вот просто встроенная.

Ладно, не важно уже.


 
sniknik ©   (2010-01-23 15:53) [28]

> sniknik, так всю программу можно в строчку вместить :).
только если не больше 255 символов длинной.

> вот именно встроенная, и именно в VCL.
странные у вас ограничения... вот у нас были "не использовать "левых"/сторонних компонент" кроме пары исключений (оправданных), и это были логичные ограничения, т.к. код передавали между филиалами, и чтобы не парится из-за того, что кто-то самовольно решил добавить "красивостей"  в прогу (там где она не нужна)... в общем понятно.
а что за ограничение "не делать собственных функций"??? дальше развиваем "не делать собственных модулей", "не писать программы...".
странно в общем. а вот сторонние использовать можно... еще более странно.


 
palva ©   (2010-01-23 15:54) [29]


> Типа как Trim (я ясно выражаюсь?)

Ну теперь яснее. Типа как Trim, как Sqrt или Copy. Что называется типа функции.
А то вопрос был о Trim, который для всей строки, а не краев.
Казалось бы, какое отношение имеет Trim к удалению дублирующихся пробелов, даже на краях.


 
Anatoly Podgoretsky ©   (2010-01-23 16:55) [30]

> Kolan  (23.01.2010 14:52:23)  [23]

А зачем ты сюда пришел?


 
Andy BitOff ©   (2010-01-23 18:43) [31]

> Kolan ©   (23.01.10 12:24) [19]
> Несомненно, так как в этом случае строчка одна.

В этом случае у тебя 1 + еще 4 тысячи с лишним строчек.
А так ты получишь всего 1 + 5:

function RemoveSpaces(const Str: string): string;
begin
 while AnsiPos("  ", Str) > 0 do
   Result := StringReplace(Str, "  ", " ", [rfReplaceall])
end;


и вызов

AHistoryList.Text := RemoveSpaces(Answer);


 
DVM ©   (2010-01-23 18:59) [32]


> Kolan ©

Нет встроенной.


 
DVM ©   (2010-01-23 19:02) [33]

А вызывать в цикле StringReplace особенно для длинных строк на мой взгляд неправильно. Слишком много копирований строк туда-сюда. Прооще написать свою функцию, и работать она будет на порядок быстрее.


 
DVM ©   (2010-01-31 21:48) [34]

вот на http://www.delphidabbler.com наткнулся на такое и сразу вспомнил эту ветку:

type
 {$IFDEF UNICODE}
 TCharSet = SysUtils.TSysCharSet;
 {$ELSE}
 TCharSet = set of Char;
 {$ENDIF}

function IsCharInSet(const Ch: Char; const Chars: TCharSet): Boolean;
begin
 {$IFDEF UNICODE}
 Result := SysUtils.CharInSet(Ch, Chars);
 {$ELSE}
 Result := Ch in Chars;
 {$ENDIF}
end;

function IsWhiteSpace(const Ch: Char): Boolean;
begin
 Result := IsCharInSet(Ch, [" ", #9, #10, #11, #12, #13]);
end;

function CompressWhiteSpace(const S: string): string;
var
 Idx: Integer;      // loops thru all characters in string
 ResCount: Integer; // counts number of characters in result string
 PRes: PChar;       // pointer to characters in result string
begin
 // Set length of result to length of source string and set pointer to it
 SetLength(Result, Length(S));
 PRes := PChar(Result);
 // Reset count of characters in result string
 ResCount := 0;
 // Loop thru characters of source string
 Idx := 1;
 while Idx <= Length(S) do
 begin
   if IsWhiteSpace(S[Idx]) then
   begin
     // Current char is white space: replace by space char and count it
     PRes^ := " ";
     Inc(PRes);
     Inc(ResCount);
     // Skip past any following white space
     Inc(Idx);
     while IsWhiteSpace(S[Idx]) do
       Inc(Idx);
   end
   else
   begin
     // Current char is not white space: copy it literally and count it
     PRes^ := S[Idx];
     Inc(PRes);
     Inc(ResCount);
     Inc(Idx);
   end;
 end;
 // Reduce length of result string if it is shorter than source string
 if ResCount < Length(S) then
   SetLength(Result, ResCount);
end;



 
Игорь Шевченко ©   (2010-01-31 22:10) [35]

DVM ©   (31.01.10 21:48) [34]

Откуда такие шедевры ?

Изумляет не сколько этот шедевр, сколько другое: я полез честно в гугль, посмотреть, а как на других языках подобные проблемы решают (из тех, что я знаю), и офигел. На С с помощью str-функций, на С++ с помощью методов класса CString, на C# с помощью методов типа string и все это в цикле.

Я извиняюсь, никаких компьютеров не хватит, если программы будут писаться подобным образом.


 
Anatoly Podgoretsky ©   (2010-01-31 22:30) [36]

Ты же сам говорил, что не важно сколько ресурсов в наше время есть программа. И это правильно в общем случае. Пока ты вылизываешь программу, то рынок уже захвачен и денег нет даже на оплату изысков программиста. Едиственная надежда, что программист изначально сразу будет писать идеально, но ведь таких мало. Поэтому в индустрии сейчас такое положение - все побоку, первичен продукт и как можно быстрее.


 
Игорь Шевченко ©   (2010-01-31 22:42) [37]

Anatoly Podgoretsky ©   (31.01.10 22:30) [36]

В разумных пределах неважно, сколько ресурсов есть программа, в неразумных - важно.

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

MS кстати, вылизывают свою систему. Или сразу пишут хорошо, но некоторые части все-таки продолжают вылизывать.


> Поэтому в индустрии сейчас такое положение - все побоку,
>  первичен продукт и как можно быстрее.


На примере Delphi это хорошо видно.
Впрочем, пока шедервы не накопят критическую массу, продукт вполне себе может жить на рынке.


 
Jeer ©   (2010-01-31 23:03) [38]

Из незабвенной QString:

function TrimDbl(const S: string; Ch: Char): string;
asm
       PUSH    ESI
       MOV     ESI,ECX
       TEST    EAX,EAX
       JE      @@qt
       MOV     ECX,[EAX-4]
       TEST    ECX,ECX
       JE      @@qt
       PUSH    EBX
       PUSH    EDI
       MOV     EBX,EAX
       MOV     EDI,EDX
       XOR     EDX,EDX
       MOV     EAX,ESI
       CALL    System.@LStrFromPCharLen
       MOV     EDX,EDI
       MOV     ECX,[EBX-4]
       MOV     EDI,[ESI]
@@lp:   MOV     AL,BYTE PTR [EBX]
       MOV     BYTE PTR [EDI],AL
       INC     EBX
       INC     EDI
       CMP     AL,DL
       JE      @@me
@@nx:   DEC     ECX
       JNE     @@lp
@@wq:   MOV     EAX,[ESI]
       MOV     BYTE PTR [EDI],0
       SUB     EDI,EAX
       MOV     [EAX-4],EDI
       POP     EDI
       POP     EBX
       POP     ESI
       RET
@@me:   CMP     DL,BYTE PTR [EBX]
       JNE     @@nx
       INC     EBX
       DEC     ECX
       JNE     @@me
       JMP     @@wq
@@qt:   MOV     EAX,ESI
       CALL    System.@LStrClr
       POP     ESI
end;


 
Игорь Шевченко ©   (2010-01-31 23:04) [39]

Jeer ©   (31.01.10 23:03) [38]

Тема юникода не раскрыта


 
Jeer ©   (2010-01-31 23:11) [40]

Ну шо поделаешь - таки, да.



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

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

Наверх




Память: 0.58 MB
Время: 0.01 c
3-1230121069
DSKalugin
2008-12-24 15:17
2010.04.04
как это будет для MSSQL?


2-1265203057
@!!ex
2010-02-03 16:17
2010.04.04
Глючит TPageControl


2-1265108213
бегинер
2010-02-02 13:56
2010.04.04
Нет перегруженной функции с такими параметрами


2-1265185615
oleg1963lora
2010-02-03 11:26
2010.04.04
Поймать OnClick в классе


3-1237759093
zod33
2009-03-23 00:58
2010.04.04
Ошибка при вставке