Page 1 of 1

StrCalc - Rechnen mit Strings [Punkt vor Strich, Klammern, P

Posted: 30 Sep 2013, 13:59
by SAPlayer
Ich habe für mein Projekt mal wieder keine Mühen gescheut und habe eine PHP-Funktion zum Rechnen mit Strings in AHK übersetzt.
Die PHP-Funktion ist nicht von mir, ich habe sie aus diesem Forum: Thread in externem Forum [Rechnen mit Strings]
Ich habe sie nach AHK übersetzt und sogar überarbeitet, sodass sie auch (hoffentlich) nach dem Punkt-vor-Strich-System arbeitet:

Code: Select all

StrCalc(str){ ;http://www.php.de/php-tipps-2010/66855-mathematische-berechnung-vom-stringinhalt.html#post507927
	stack := Object()
	v := Object()
	m := Object()
	v[0] := v[1] := op := ""
	pos := 0
	str := RegExReplace(RegExReplace(str, "\s"), "\d+[*/]\d+", "($0)")
	while(pos := RegExMatch(str, "([()+*/^-]|(\-?\d+))", regex, pos + (StrLen(regex1) ? StrLen(regex1) : 1)))
		m.Insert(regex1)
	for i, tk in m
	{
		if(tk = "+" OR tk = "-" OR tk = "*" OR tk = "/" OR tk = "^"){
			op := tk
			continue
		}
		else if(tk = "("){
			stack.Insert([v[0], v[1], op])
			v[0] := v[1] := op := ""
			continue
		}
		else if(tk = ")"){
			kResult := v[0]
			v[0] := stack[stack._maxIndex(), 1]
			v[1] := stack[stack._maxIndex(), 2]
			op := stack[stack._maxIndex(), 3]
			stack.Remove()
			v[(v[0] = "") ? 0 : 1] := kResult
			bracketMode := 1
		}
		if(!bracketMode)
			v[((op = "") && (v[0] = "")) ? 0 : 1] := tk
		if(v[1] != ""){
			if(op = "^")
				v[0] := v[0] ** v[1]
			else
				v[0] := ((op = "+") * (v[0] + v[1])) + ((op = "*") * (v[0] * v[1])) + ((op = "/") * (v[0] / v[1])) + ((op = "-") * (v[0] - v[1]))
			op := v[1] := ""
		}
		bracketMode := 0
	}
	return v[0]
}
Normalerweise sollten alle normalen Rechenarten (+-*/), Klammern, Potenzen (^) und Punkt-vor-Strich-System funktionieren.
Das habe ich jetzt des Öfteren getestet, ich garantiere allerdings keine Richtigkeit der Ergebnisse.
Ein Aufruf sieht zum Beispiel so aus:

Code: Select all

MsgBox, % StrCalc("10 + 20") ;30, die Leerzeichen werden ignoriert
MsgBox, % StrCalc("10^3") ;1000
MsgBox, % StrCalc("20+30*10") ;320, wegen Punkt vor Strich
MsgBox, % StrCalc("(20+30)*10") ;500
Geplant:
  • Potenz vor Punkt
  • Prozent akzeptieren (z.B. "1000*10%" = 100)
Ich hoffe, dass euch das ein wenig weiterhilft
SAPlayer

Re: StrCalc - Rechnen mit Strings [Punkt vor Strich, Klammern, P

Posted: 01 Apr 2016, 02:38
by Gerdi
Hallo SAPlayer,

darf ich StrCalc() in ZackZackOrdner
https://autohotkey.com/boards/viewtopic ... 10&t=15248
a) verwenden?
b) einbinden (Deine Quelltexte mit Quellenangabe)?
c) verändert einbinden (momentan stoert das ".000000" mit Quellenangabe)?

Dies ist nur eine Vorab-Anfrage ungeprüft ob nicht eine der zahlreichen eval() Funktionen besser für ZackZackOrdner geeignet ist.

Danke Gerdi

Re: StrCalc - Rechnen mit Strings [Punkt vor Strich, Klammern, P

Posted: 01 Apr 2016, 03:08
by jNizM
SAPlayer ist seit über nem Jahr nicht mehr aktiv hier im Forum.
Keine Ahnung ob er überhaupt wieder auftaucht.

Kannst es ja mit ner E-Mail probieren: saplayer.bplaced.net/impressum

Re: StrCalc - Rechnen mit Strings [Punkt vor Strich, Klammern, P

Posted: 01 Apr 2016, 04:17
by HinkerLoden
gab doch die Monster lib . Ist doch ziemlich das gleiche.

Re: StrCalc - Rechnen mit Strings [Punkt vor Strich, Klammern, P

Posted: 01 Apr 2016, 04:22
by jNizM
Du meinst eval?
- eval (using JS/COM) von tidbit
- Eval - Evaluate Expressions in Strings Dynamically von Pulover
- ExprEval() - Evaluate Expressions! von Uberi
- eval() - evaluate AutoHotkey expressions dynamically! von fincs

Oder mit ActiveScript von Lexikos

Code: Select all

#NoEnv
#Include ActiveScript.ahk

; eval Function (VBScript)   |   https://msdn.microsoft.com/en-us/library/0z5x4094(v=vs.84).aspx
vb := new ActiveScript("VBScript")
MsgBox % vb.Eval("20+30*10")    ; ==> 320 (Punkt vor Strich)

; eval Method   (JScript)    |   https://msdn.microsoft.com/en-us/library/b51a45x6(v=vs.90).aspx
js := new ActiveScript("JScript")
MsgBox % js.Eval("20+30*10")    ; ==> 320 (Punkt vor Strich)

Re: StrCalc - Rechnen mit Strings [Punkt vor Strich, Klammern, P

Posted: 01 Apr 2016, 06:39
by Gerdi
Danke Euch beiden,
zum Sichten etc. werde ich wie angedeutet erst später kommen.

Re: StrCalc - Rechnen mit Strings [Punkt vor Strich, Klammern, P

Posted: 01 Apr 2016, 14:08
by SAPlayer
Klar, das ist gar kein Thema. Kannst das auch abändern wie immer du willst.
Wenn das Ganze mehr mit rechtlichen Lizenzen zugehen soll, wäre das denke ich eine Verbreitung nach Art der WTFPL. Von mir aus auch ohne Nennung des Autors.

Re: StrCalc - Rechnen mit Strings [Punkt vor Strich, Klammern, P

Posted: 01 Apr 2016, 21:51
by nnnik
1A das du noch mitliest.

Re: StrCalc - Rechnen mit Strings [Punkt vor Strich, Klammern, P

Posted: 02 Apr 2016, 09:07
by SAPlayer
Ich lese eigentlich nicht mehr mit, aber Gerdi hat mir eine Mail geschrieben um mich auf das Thema hinzuweisen ;)