Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
Delphi 10.4 Sydney
|
AW: Einheiten parsen
11. Mär 2015, 16:15
Hi Bud,
ja, die Rekursion hatte ich gestern nicht wirklich (mehr) kapiert gehabt. Aber heute ist ein neuer Tag. So wie ich's vorhatte ging's aus mehreren Gründen nicht. Man kann entweder mit Äpfeln (double) mit oder Birnen (TEinheiten) rechnen. Also dann doch einen Extradurchlauf. Man braucht eine neue Solve.
Delphi-Quellcode:
function TJMUnitParser.Solve(S: string): TParserUnitStyle;
begin
try
if LastPos('+', S) > 0 then
Result := GetPlus(Solve(Left(S, '+', true)), Solve(Right(S, '+', true)))
else
if LastPos('-', S) > 0 then
Result := GetMinus(Solve(Left(S, '-', true)), Solve(Right(S, '-', true)))
else
if LastPos('*', S) > 0 then
Result := GetMult(Solve(Left(S, '*', true)), Solve(Right(S, '*', true)))
else
if LastPos('/', S) > 0 then
Result := GetDiv(Solve(Left(S, '/', true)), Solve(Right(S, '/', true)))
else
if LastPos(':', S) > 0 then // div;
Result := GetIntDiv(Solve(Left(S, ':', true)), Solve(Right(S, ':', true)))
else
if LastPos('\', S) > 0 then // mod;
Result := GetIntMod(Solve(Left(S, '\', true)), Solve(Right(S, '\', true)))
else
if FirstPos('^', S) > 0 then
Result := GetPower(Solve(Left(S, '^', false)), Solve(Right(S, '^', false)))
else
if Parenthesis(S) then // ( .. )
Result := Solve(S)
else
Result := FUnits.SignToStyle(S);
except
Result := pusNone;
end;
end;
Vom Ablauf her isses hier so: Im obigen Beispiel 5,0 kN/m2 * 0,70 m / cos(30) wird beim Aufbereiten für's Einheitenparsen zunächst [Einheit_1][Einheit_ kN/m2] * [Einheit_m] / [Einheit_1]. Um den Term Term mathematisch so zu parsen wie den Term ohne Einheiten braucht muß man nur [Einheit_1][Einheit_ X] zu [Einheit_ X] ersetzen (bzw. [Einheit_ X][Einheit_1] zu [Einheit_ X]).
Hab den Code mal angehängt. Falls du Böcke hat, eine Variante mit einem Stack wär' nicht schlecht.
LG
Thomas
|