๐ซ JAVA
๐งฎ Calculator with Js and Thymeleaf
๐ก controller
@Controller
public class CalculatorController {
@GetMapping("/")
public String index() {
return "index";
}
@PostMapping("/calculate")
@ResponseBody
public Map<String, Double> calculate(
@RequestParam double num1,
@RequestParam double num2,
@RequestParam String operator
) {
double result = switch (operator) {
case "add" -> num1 + num2;
case "subtract" -> num1 - num2;
case "multiply" -> num1 * num2;
case "divide" -> num2 != 0 ? num1 / num2 : Double.NaN;
default -> Double.NaN;
};
return Map.of("result", result);
}
}
๐ผ๏ธ thymeleaf
<body>
<div class="calculator-container">
<div id="display">0</div>
<div class="calculator-grid">
<button class="btn function" data-action="clear">C</button>
<button class="btn function" data-action="divide">รท</button>
<button class="btn function" data-action="multiply">ร</button>
<button class="btn function" data-action="subtract">โ</button>
<button class="btn digit" data-digit="7">7</button>
<button class="btn digit" data-digit="8">8</button>
<button class="btn digit" data-digit="9">9</button>
<button class="btn function" data-action="add">+</button>
<button class="btn digit" data-digit="4">4</button>
<button class="btn digit" data-digit="5">5</button>
<button class="btn digit" data-digit="6">6</button>
<button class="btn" data-action="equals" rowspan="2">=</button>
<button class="btn digit" data-digit="1">1</button>
<button class="btn digit" data-digit="2">2</button>
<button class="btn digit" data-digit="3">3</button>
<button class="btn digit zero" data-digit="0">0</button>
<button class="btn digit" data-digit=".">.</button>
</div>
</div>
<script th:src="@{/main.js}"></script>
</body>
๐ฏ js
const display = document.getElementById('display');
let first = '';
let second = '';
let operator = null;
let resultDisplayed = false;
document.querySelectorAll('.digit').forEach(
btn => {
btn.addEventListener('click', () => {
if (resultDisplayed) {
first = '';
resultDisplayed = false;
}
const digit = btn.dataset.digit;
if (!operator) {
if (!(digit === '.' && first.includes('.'))) first += digit;
display.textContent = first || '0';
display.scrollLeft = display.scrollWidth;
} else {
if (!(digit === '.' && second.includes('.'))) second += digit;
display.textContent = second || '0';
display.scrollLeft = display.scrollWidth;
}
});
}
)
document.querySelectorAll('.function').forEach(
btn => {
btn.addEventListener('click', () => {
const action = btn.dataset.action;
if (action === 'clear') {
first = '';
second = '';
operator = null;
display.textContent = '0';
return;
}
if (action === 'equals') return;
operator = action;
resultDisplayed = false;
})
}
)
document.querySelector('[data-action="equals"]').addEventListener(
'click',
() => {
const params = new URLSearchParams({
num1: first,
num2: second,
operator
});
fetch('/calculate', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded'},
body: params
}).then(res => res.json())
.then(data => {
display.textContent = data.result;
first = data.result.toString();
second = '';
operator = null;
resultDisplayed = true;
})
.catch(error => {
console.error(error);
display.textContent = 'Error';
})
}
);
โถ๏ธ demo
