Nur ist das Problem der 1000-er Formatierung damit nicht erschlagen.
Eine Test mit 1.024,23 ergibt dann ein False mit einer 0 als Ergebnis.
Ah ja, ich vergaß! Nein, dann funktioniert das so nicht. Dann muss man erst den Dezimalseparator ermitteln und dann die Tausendertrenner eliminieren. Ist dann allerdings nicht mehr so kompakt:
Delphi-Quellcode:
function TryStrToFloatAll(const S: string; out Value: Double): Boolean;
var
sep: set of Char;
dez: Char;
I: Integer;
begin
Result := False;
{ collect possible decimal separators }
sep := [];
for I := 0 to Length(AllFormatSettings) - 1 do begin
Include(sep, AllFormatSettings[I].DecimalSeparator);
end;
{ determine current decimal separator }
dez := #0;
for I := Length(S) downto 0 do begin
if S[I] in Sep then begin
dez := S[I];
Break;
end;
end;
{ no decimal separator => wrong input. Try StrToInt instead. }
if dez = #0 then Exit;
Result := True;
for I := 0 to Length(AllFormatSettings) - 1 do begin
{ try all formatsettings with found decimal separator }
if dez = AllFormatSettings[I].DecimalSeparator then begin
{ eliminate thousand separator before conversion }
if TryStrToFloat(StringReplace(S, AllFormatSettings[I].ThousandSeparator, '', [rfReplaceAll]), Value, AllFormatSettings[I]) then Exit;
end;
end;
Result := False;
end;
Wenn sicher ist, daß nur
Punkt und
Komma als Separatoren auftreten können, dann ließe sich der Code natürlich auch etwas schlanker gestalten. Ich habe mir aber jetzt die Settings der einzelnen Länder nicht angeschaut.