Spaces:
Sleeping
Sleeping
File size: 1,332 Bytes
06e4ebc |
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 |
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)}" |