Der Debugger ist dein Freund

Wenn du in deiner Schleife schaust, ob das aktuelle Zeichen ein Leerzeichen ist, ist dort 1 (in Worten: ein) Zeichen. Ersetzt du es durch " - " sind das 3 (in Worten: drei) Zeichen. Also stimmt dein i nicht mehr, denn es zeigt jetzt auf das erste Leerzeichen des eingefügten " - ", da aber der Schleifendurchlauf zu Ende ist, zeigt es kurz darauf auf das "-" von " - ". Beim nächsten Durchlauf zeigt i dann auf das zweite Leerzeichen von " - ", ergo werden nochmal mit StringReplace sämtliche Leerzeichen auf dem String entfernt, er wird wieder um zwei verkürzt. Damit rutscht die zweite Zahl hinter dem Leerzeichen (in deinem Fall die 4) und fügt dort nochmal " - " ein, denn er hat ja vorher festgestellt, daß er wieder auf ein Leerzeichen getroffen ist, obwohl er das mit StringReplace wieder gelöscht hat.
Folgendes klappt vielleicht besser:
Delphi-Quellcode:
function ReplaceString(fNummer: String): String;
var
i : Integer;
begin
if (fNummer<>'')then
begin
fNummer := StringReplace(fNummer,'(','',[rfReplaceAll]);
fNummer := StringReplace(fNummer,')','',[rfReplaceAll]);
fNummer := StringReplace(fNummer,'/','',[rfReplaceAll]);
fNummer := StringReplace(fNummer,'\','',[rfReplaceAll]);
fNummer := StringReplace(fNummer,'-','',[rfReplaceAll]);
for I := 1 to Length(fNummer) do // Iterate
begin
if fNummer[i]= ' ' then
begin
fNummer[i] := '-';
end;
end; // for
fNummer := StringReplace(fNummer, '-', ' - ', [rfReplaceAll]);
end;
Result := fNummer;
end;