Spaces:
Sleeping
Sleeping
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)}" |