Форум: "Основная";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];
ВнизКак упростить алгоритм. Найти похожие ветки
← →
NetKnight (2003-07-23 16:01) [0]Вот имеется такой код, для того, чтоб в стринговых числах разделять нужным символом через каждых 3 числа:
function AddPoints(str:string,delimeter:string):string;
var i:integer;
s:string;
begin
Result:=str;
if length(str)>3 then
begin
s:=str;
for i:=0 to length(str) do
s[length(str)-i+1]:=str[i];
str:="";
while length(s)>3 do
begin
str:=str+copy(s,0,3)+delimeter;
delete(s,1,3);
end;
str:=str+s;
s:=str;
for i:=0 to length(str) do
s[length(str)-i+1]:=str[i];
Result:=s;
end;
end;
Но самому мне этот код не нравится, мне кажется, что есть способ проще и эффективнее. Подскажите, кто сталкивался.
← →
Sandman25 (2003-07-23 16:14) [1]
L := Length(Str);
I := S + L div 3;
SetLength(Str, I);
case L mod 3 of
1:
begin
Str[I] := Str[L];
Dec(I);
Dec(L);
end
2:
begin
Str[I] := Str[L];
Str[I-1] := Str[L-1]
I := I - 3;
L := L - 2;
end
end;
repeat
Str[I] := Delimiter;
Str[I-1] := Str[L];
Str[I-2] := Str[L-1];
Str[I-3] := Str[L-2];
I := I - 4;
L := L - 3;
until L = 0;
Возможны ошибки, но идея должна быть понятна
← →
Sandman25 (2003-07-23 16:15) [2]Во второй строчке надо
I := L + L div 3
← →
Radionov Alexey (2003-07-23 16:35) [3]Неоптимально, но "прозрачно" :)
Function mAddPoints(Const str, delimiter: String): String;
Var
k, l: Integer;
Begin
Result := "";
l := 0;
For k := Length(str) Downto 1 Do
Begin
inc(l);
Result := Str[k] + Result;
If (k>1) and (l Mod 3 = 0) Then
Result := Delimiter + Result;
End;
End;
← →
Roma (2003-07-23 16:40) [4]> NetKnight © (23.07.03 16:01)
Ты не сказал, откуда отсчитывать (т.е., в каком краю находится первая группа) - справа налево или слева направо...
Если слева направо:
function AddDelimeter(const S, Delimeter: string;
const GroupCount: Integer): string;
var
i: Integer;
begin
Result := S;
for i := (Length(S) - 1) div GroupCount downto 1 do
Insert(Delimeter, Result, GroupCount * i + 1);
end;
Если справа налево, то кое-что переворачиваем:
function AddDelimeter2(const S, Delimeter: string;
const GroupCount: Integer): string;
var
i: Integer;
begin
Result := S;
for i := 1 to (Length(S) - 1) div GroupCount do
Insert(Delimeter, Result, Length(S) - GroupCount * i + 1);
end;
Delimeter - что вставляем, GroupCount - количество символов в группе... Если эти параметры точно известны (надо через 3 символа ставить пробел, например), то можно и упростить немножко функции...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c