Форум: "Начинающим";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];
ВнизЕсть ли 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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.004 c