leider passt das von der Parameterliste her nicht (und liefert vor allem keinen endptr zurück).
Meine momentane Lösung sieht (nach einem Blick auf TextToFloat) wie folgt aus:
Delphi-Quellcode:
// maybe have an overloaded Version with Extented result
function StrToDecimal(nptr: PAnsiChar; Var endptr: PAnsiChar; Const AFormatSettings: TFormatSettings): Double;
Var
LDecSep: AnsiChar;
LResult: Extended;
LSaveNext: AnsiChar;
begin
LDecSep := AnsiChar(AFormatSettings.DecimalSeparator);
Result := 0;
// decimal part (no sign -> its a token
endptr := nptr;
while (endptr^ >= #$30) And (endptr^ <= #$39) do // scan digits
inc(endptr);
// frac part ?
if endptr^ = LDecSep then
begin
inc(endptr);
while (endptr^ >= #$30) And (endptr^ <= #$39) do // scan frac-part
inc(endptr);
end;
// exponent
if (endptr^ = 'e') Or (endptr^ = 'E') then
begin
inc(endptr);
if (endptr^= '+') Or (endptr^='-') then // exp can have a sign
inc(endptr);
while (endptr^ >= #$30) And (endptr^ <= #$39) do // scan exponent
inc(endptr);
end;
if endptr <> nptr then // did we find a number?
begin
LSaveNext := endptr^; // save and replace next char
endptr^ := #0; // TextToFloat needs #0 terminated number
try
If AnsiStrings.TextToFloat(nptr, LResult, fvExtended, AFormatSettings) Then
Result := LResult;
finally
endptr^ := LSaveNext; // restore string
end;
end;
end;
Edit: Als Frage an die C-Profis hier bleibt noch ob strtod() noch zusätzliche schreibweisen für die Zahlen unterstützt?