Freddolin's picture
Rename tools/math_tool.py to math_tool.py
0975d5c verified
raw
history blame
1.33 kB
import re
import ast
import operator
def safe_eval(expression: str) -> float:
"""Säkert evaluera matematiska uttryck"""
# Tillåtna operatorer
operators = {
ast.Add: operator.add,
ast.Sub: operator.sub,
ast.Mult: operator.mul,
ast.Div: operator.truediv,
ast.Pow: operator.pow,
ast.BitXor: operator.xor,
ast.USub: operator.neg,
}
def eval_expr(node):
if isinstance(node, ast.Num):
return node.n
elif isinstance(node, ast.BinOp):
return operators[type(node.op)](eval_expr(node.left), eval_expr(node.right))
elif isinstance(node, ast.UnaryOp):
return operators[type(node.op)](eval_expr(node.operand))
else:
raise TypeError(node)
try:
return eval_expr(ast.parse(expression, mode='eval').body)
except:
return None
def calculate_math(expression: str) -> str:
"""Beräkna matematiska uttryck"""
try:
# Rensa uttrycket
clean_expr = re.sub(r'[^0-9+\-*/().\s]', '', expression)
result = safe_eval(clean_expr)
if result is not None:
return str(result)
else:
return f"Cannot calculate: {expression}"
except Exception as e:
return f"Math error: {str(e)}"