Entwickler-Ecke
Multimedia / Grafik - String in Integer - Rechnungs Problem
CrOc - Mi 03.12.03 15:05
Titel: String in Integer - Rechnungs Problem
hi,
ich hab ein label erstellt, indem der Text '4*4' steht. Nun will ich aber, dass wenn ich auf den Button klick im Edit Fenster das ergebnis steht. Hab es schon mit StrToInt versucht, aber dann bringt der immer so ein umwandlungsproblem.
Christian S. - Mi 03.12.03 15:12
Hallo!
Für so etwas brauchst Du einen
PARSER.
StrToInt bzw. StrToFloat wandeln nur wirkliche Zahlen aber keine mathematischen Ausdrücke um.
MfG
Peter
CrOc - Mi 03.12.03 15:16
und wie soll das dann im meinen Fall funktionieren?
Christian S. - Mi 03.12.03 15:36
Habe ich doch geschrieben: ein Parser muss her.
ShadowThief - Mi 03.12.03 15:46
du musst ein programm schreiben, das checkt, dass 4*4 bedeutet,
dass 4 mit 4 multipliziert werden muss.
shadow.
Anonymous - Mi 03.12.03 17:23
Wenn du das Rekursiv (bäh ;) ) machst, geht das recht schnell.
Den Eingabestring zuerst mit trim bearbeiten (und eventuelle Klammern an Anfang und Ende beseitigen), dann nacheinander auf '+', '-', '*' und '/' überprüfen (heißt es nicht so schön Punkt-Nach-Strich ;)) Da musst du dir eine fkt schreiben, die das nicht in Klammern findet, falls es die beachten soll.
Dann an der Fundstelle Abtrennen und die beiden einzelstrings wieder an die Fkt übergeben...
Udontknow - Mi 03.12.03 17:35
Was ja dann eine Art Parser wäre, aber ich glaube nicht, daß Croc (will dir nicht zu nahe treten) das mit seinem Wissensstand hinbekommt...
Cu, :)
Udontknow
matze - Mi 03.12.03 17:59
da gäbe es ja fertige parser
Anonymous - Mi 03.12.03 18:02
oder hier den: Hat zwar keine Fkten und Variablen usw, aber sollte fürs erste reichen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58:
| function parse(s: string): extended;
function posx(c: char; s: string): integer; var p: pchar; kc: integer; begin result := -1; kc := 0; p := pchar(s); while p^ <> #0 do begin case p^ of '(': inc(kc); ')': dec(kc); end; if kc < 0 then exit; if (kc = 0) and (p^ = c) then begin result := length(s) - length(p) + 1; exit; end; inc(p); end; end;
function rembrackets(s: string): string; begin while (s <> '') and (s[1] = '(') and (s[length(s)] = ')') do s := copy(s, 2, length(s)-2); result := s; end; function Anfang(s: string; bis: integer): string; begin result := copy(s, 1, bis-1); end;
function ende(s: string; von: integer): string; begin result := copy(s, von, length(s)); end;
var ppl, pmi, pdu, pma: integer; begin s := trim(rembrackets(trim(s))); if TryStrToFloat(s, result) then exit; ppl := posx('+', s); pmi := posx('-', s); pdu := posx('/', s); pma := posx('*', s); if ppl > 0 then result := parse(anfang(s, ppl)) + parse(ende(s, ppl+1)) else if pmi > 0 then result := parse(anfang(s, pmi)) - parse(ende(s, pmi+1)) else if pdu > 0 then result := parse(anfang(s, pdu)) / parse(ende(s, pdu+1)) else if pma > 0 then result := parse(anfang(s, pma)) * parse(ende(s, pma+1)) else raise Exception.Create('Fehler im Term') end; |
Wenn dus iterativ haben willst, wirds aber schon mehr arbeit...
[EDIT]Achtung: Mir ist gerade aufgefallen dass das Teil nicht mit Klammern zurechtkommt.
[EDIT2] Jetzt schon ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!