ich bin auf der Suche nach einem einfachen Formel Parser. Dazu habe ich ein wenig im Netz gestöbert. Da fpSpreadSheet ja eigentlich so einen anbietet, dachte ich mir, ich borge mir diesen aus.
Dazu habe ich einen kleinen Test geschrieben. Ich möchte gern immer ein Ergebnis (String vom Typ #,##) haben, egal, was der User eingibt:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
Parser: TsExpressionParser;
begin
Parser := TsSpreadsheetParser.Create(nil);
try
Parser.LocalizedExpression[DefaultFormatSettings] := '32*5,2 + 24 *7 - 4* 2';
Caption := Parser.Expression + ': ' + FormatFloat('#,##0.00', Parser.AsFloat);
Parser.LocalizedExpression[DefaultFormatSettings] := '32*5 + 24 *7 - 4* 2';
Caption := Parser.Expression + ': ' + FormatFloat('#,##0.00', Parser.AsInteger);
finally
Parser.Free;
end;
end;
Nun weiß ich nicht, ob der Nutzer nur ganze Zahlen oder Zahlen mit Kommas eingibt (den String könnte man natürlich zuvor nach Kommas durchsuchen) und deshalb wollte ich folgenden Code verwenden:
Code: Alles auswählen
Parser.LocalizedExpression[DefaultFormatSettings] := '32*5,2 + 24 *7 - 4* 2';
case Parser.ResultType of
rtFloat: Caption := Parser.Expression + ': ' + FormatFloat('#,##0.00', Parser.AsFloat);
rtInteger: Caption := Parser.Expression + ': ' + FormatFloat('#,##0.00', Parser.AsInteger);
else Caption := Parser.Expression + ': ' + FormatFloat('#,##0.00', 0);
end;
Ich habe noch die Exceptions abgefangen (funktioniert aber nur, wenn der Parser nicht versucht eine Eingabe als eine "Zelle" vom WorkSheet zu interpretieren):
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
Parser: TsExpressionParser;
i: Integer;
s: String;
begin
s := 'ab32*5,2 + 24 *7 - 4* 2'; //funktioniert nicht (versucht Zelle in WorkSheet zu finden)
s := '32sd*5,2 + 24 *7 - 4* 2'; //funktioniert
s := '32*5,2 + 24 *7 - 4* 2'; //funktioniert
s := '32*5 + 24 *7 - 4* 2'; //funktioniert
Parser := TsSpreadsheetParser.Create(nil);
for i := 0 to 1 do
try
Parser.LocalizedExpression[DefaultFormatSettings] := s;
case i of
0: Caption := Parser.Expression + ': ' + FormatFloat('#,##0.00', Parser.AsInteger);
1: Caption := Parser.Expression + ': ' + FormatFloat('#,##0.00', Parser.AsFloat);
end;
Parser.Free;
Exit;
except
on e: Exception do
if i = 1 then
ShowMessage('Ungültige Eingabe: ' + s + LineEnding + e.Message);
end;
Parser.Free;
end;
Welchen Formel Parser würdet Ihr verwenden (es geht dabei wirklich nur um einfachste Rechenfunktionen á la a + b oder a * b + c * d oder a * b * c + d * e * f ...) ?