Wenn dies Ihr erster Besuch hier ist,
lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen
durch. Sie müssen sich vermutlich registrieren,
bevor Sie Beiträge verfassen können. Klicken Sie oben auf 'Registrieren', um den Registrierungsprozess zu
starten. Sie können auch jetzt schon Beiträge lesen. Suchen Sie sich einfach das Forum aus, das Sie am meisten
interessiert.
function DeleteNonNumbers(const Value: String): String;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(Value) to
if Value[I] in ['0'..'9'] do
Result := Result + Value[I];
end;<br>
<br>
// 2. Ansatz, schneller <br>
function DeleteNonNumbers(const Value: String): String;
var
I: Integer;
P: PChar;
begin
SetLength(Result, Length(Value));
P := PChar(Result);
for I := 1 to Length(value) do
if Value[I] in ['0'..'9'] then
begin
P^ := Value[I];
Inc(P);
end;
SetLength(Result, P - PChar(Result));
end; <br>
</pre>
Die erste Methode braucht im ungünstigen falle genau Length(Value) mal die Reallozierung des Strings result. z.B. ein String aus 10 NULLEN würde dann 10 mal den Memory Manager bemühen um Result zu vergrößern.<br>
Dieses Mancko wird im zweiten Ansatz auf minimal 2 Allozierungen reduziert. Im ungünstigen Falle werden aber Length(value) bytes zu viel alloziert, nämlich wenn z.B. Value aus 10 mal 'A' besteht würden 10 Bytes zu viel alloziert.
Hallo Hagen,<br>KLASSE.<br>Vielen Dank für diesen Beitrag. Der Beitrag hat mir meine eigene Faulheit vor Augen geführt. Früher,
als 286er noch der Hammer waren, war der 2. Ansatz der normale Ansatz.<br>Wenn man mit den beiden Funktionen etwas herumspielt, stellt sich heraus, dass der 2. Ansatz nicht nur schneller, sondern erheblich schneller ist. <br>Jens Schuman
Comment