Spaces:
Sleeping
Sleeping
| import math | |
| import streamlit as st | |
| st.set_page_config(page_title="Calculator", page_icon="🧮", layout="centered") | |
| # ---- Helpers ---- | |
| def safe_div(a, b): | |
| if b == 0: | |
| raise ZeroDivisionError("Cannot divide by zero") | |
| return a / b | |
| def fmt(x): | |
| try: | |
| # Show ints without .0 | |
| return int(x) if float(x).is_integer() else x | |
| except Exception: | |
| return x | |
| def add_history(expr, result): | |
| st.session_state.setdefault("history", []) | |
| st.session_state.history.insert(0, f"{expr} = {result}") | |
| # keep last 20 | |
| st.session_state.history = st.session_state.history[:20] | |
| # ---- Sidebar ---- | |
| with st.sidebar: | |
| st.header("⚙️ Options") | |
| theme = st.radio("Mode", ["Basic", "Scientific"], horizontal=True) | |
| show_history = st.checkbox("Show history", True) | |
| st.markdown("---") | |
| st.caption("Tip: Use the Basic tab for two number math. Use Scientific for single number functions and powers.") | |
| st.title("🧮 Streamlit Calculator") | |
| st.write("A simple calculator ready for Hugging Face Spaces.") | |
| # ---- Basic Calculator ---- | |
| if theme == "Basic": | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| a = st.number_input("First number (a)", value=0.0, step=1.0, format="%.10f") | |
| with col2: | |
| b = st.number_input("Second number (b)", value=0.0, step=1.0, format="%.10f") | |
| op = st.selectbox( | |
| "Operation", | |
| ["+", "-", "×", "÷", "a^b (power)", "a % b (mod)"], | |
| index=0 | |
| ) | |
| if st.button("Calculate", use_container_width=True): | |
| try: | |
| if op == "+": | |
| result = a + b | |
| expr = f"{a} + {b}" | |
| elif op == "-": | |
| result = a - b | |
| expr = f"{a} - {b}" | |
| elif op == "×": | |
| result = a * b | |
| expr = f"{a} × {b}" | |
| elif op == "÷": | |
| result = safe_div(a, b) | |
| expr = f"{a} ÷ {b}" | |
| elif op == "a^b (power)": | |
| result = math.pow(a, b) | |
| expr = f"{a}^{b}" | |
| elif op == "a % b (mod)": | |
| if b == 0: | |
| raise ZeroDivisionError("Cannot mod by zero") | |
| result = a % b | |
| expr = f"{a} % {b}" | |
| else: | |
| raise ValueError("Unknown operation") | |
| result_fmt = fmt(result) | |
| st.success(f"Result: {result_fmt}") | |
| add_history(expr, result_fmt) | |
| except Exception as e: | |
| st.error(f"Error: {e}") | |
| # ---- Scientific Calculator ---- | |
| else: | |
| col_a, col_b = st.columns([2, 1]) | |
| with col_a: | |
| x = st.number_input("Value (x)", value=0.0, step=1.0, format="%.10f") | |
| with col_b: | |
| use_degrees = st.checkbox("Trig in degrees", True) | |
| func = st.selectbox( | |
| "Function", | |
| [ | |
| "sin(x)", "cos(x)", "tan(x)", | |
| "asin(x)", "acos(x)", "atan(x)", | |
| "ln(x)", "log10(x)", "sqrt(x)", | |
| "exp(x)", "abs(x)", "factorial(x) (non negative integer)", | |
| "x^n (power)" | |
| ], | |
| index=0 | |
| ) | |
| n = None | |
| if func == "x^n (power)": | |
| n = st.number_input("Exponent (n)", value=2.0, step=1.0, format="%.10f") | |
| if st.button("Calculate", use_container_width=True): | |
| try: | |
| val = x | |
| angle = math.radians(x) if use_degrees else x | |
| if func == "sin(x)": | |
| res = math.sin(angle) | |
| expr = f"sin({x}{'°' if use_degrees else ''})" | |
| elif func == "cos(x)": | |
| res = math.cos(angle) | |
| expr = f"cos({x}{'°' if use_degrees else ''})" | |
| elif func == "tan(x)": | |
| res = math.tan(angle) | |
| expr = f"tan({x}{'°' if use_degrees else ''})" | |
| elif func == "asin(x)": | |
| if val < -1 or val > 1: | |
| raise ValueError("asin domain is [-1, 1]") | |
| ang = math.asin(val) | |
| res = math.degrees(ang) if use_degrees else ang | |
| expr = f"asin({x})" | |
| elif func == "acos(x)": | |
| if val < -1 or val > 1: | |
| raise ValueError("acos domain is [-1, 1]") | |
| ang = math.acos(val) | |
| res = math.degrees(ang) if use_degrees else ang | |
| expr = f"acos({x})" | |
| elif func == "atan(x)": | |
| ang = math.atan(val) | |
| res = math.degrees(ang) if use_degrees else ang | |
| expr = f"atan({x})" | |
| elif func == "ln(x)": | |
| if val <= 0: | |
| raise ValueError("ln domain is x > 0") | |
| res = math.log(val) | |
| expr = f"ln({x})" | |
| elif func == "log10(x)": | |
| if val <= 0: | |
| raise ValueError("log10 domain is x > 0") | |
| res = math.log10(val) | |
| expr = f"log10({x})" | |
| elif func == "sqrt(x)": | |
| if val < 0: | |
| raise ValueError("sqrt domain is x >= 0") | |
| res = math.sqrt(val) | |
| expr = f"√({x})" | |
| elif func == "exp(x)": | |
| res = math.exp(val) | |
| expr = f"exp({x})" | |
| elif func == "abs(x)": | |
| res = abs(val) | |
| expr = f"|{x}|" | |
| elif func == "factorial(x) (non negative integer)": | |
| if val < 0 or not float(val).is_integer(): | |
| raise ValueError("factorial requires a non negative integer") | |
| res = math.factorial(int(val)) | |
| expr = f"{int(val)}!" | |
| elif func == "x^n (power)": | |
| res = math.pow(val, n) | |
| expr = f"{val}^{n}" | |
| else: | |
| raise ValueError("Unknown function") | |
| res_fmt = fmt(res) | |
| st.success(f"Result: {res_fmt}") | |
| add_history(expr, res_fmt) | |
| except OverflowError: | |
| st.error("Result overflowed for given input") | |
| except Exception as e: | |
| st.error(f"Error: {e}") | |
| # ---- History ---- | |
| if show_history: | |
| st.markdown("### 📝 History") | |
| if st.session_state.get("history"): | |
| for i, line in enumerate(st.session_state.history, 1): | |
| st.code(f"{i}. {line}") | |
| if st.button("Clear history"): | |
| st.session_state.history = [] | |
| st.toast("History cleared") | |
| else: | |
| st.caption("No calculations yet") | |
| # ---- Footer ---- | |
| st.markdown("---") | |
| st.caption("Built with Streamlit. Ready for Hugging Face Spaces.") | |