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)}" |