-
Notifications
You must be signed in to change notification settings - Fork 0
/
helpers.js
127 lines (116 loc) · 2.89 KB
/
helpers.js
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// OPERATE
const operations = new Set("+-*/");
const opToWord = {
"+": "add",
"-": "subtract",
"*": "multiply",
"/": "divide",
};
function operate(operator, a, b) {
// Ensure numbers are floats
a = parseFloat(a);
b = parseFloat(b);
let result = null;
switch (operator) {
case "+":
result = a + b;
break;
case "-":
result = a - b;
break;
case "*":
result = a * b;
break;
case "/":
result = a / b;
if (b === 0) {
return "Snarky error message";
}
break;
}
if (isNaN(result)) {
// Catch-all NaN errors
alert("Oops!");
// Clear
document.querySelector("#c-btn").click();
}
return result;
}
// HELPER FUNCTIONS
function setDisplay(input = "", add = false, resulting = false) {
// Append onto displayed number
if (add) {
if (displayNode.textContent.length < 10) {
// Leading decimal
if (input === "." && displayNode.textContent === "") {
input = "0.";
}
displayNode.textContent += input;
displayNum += input;
}
// Overwrite displayed number
} else {
if (resulting) {
if (input === "Snarky error message") {
alert("Not today, chief.");
[displayNum, displayNode.textContent] = [null, "ERR"];
return;
}
// Integer too large
if (parseFloat(input) > 9.99999e99) {
input = "ERR";
displayNum = null;
} else {
// Set displayNum to be the "actual" number (here it becomes a number rather than a string)
displayNum = input;
// Format input number to be displayed
input = formatNum(input);
}
displayNode.textContent = input;
} else {
displayNode.textContent = input;
displayNum = input;
}
}
updateDecimalNode();
}
function isValid(num) {
// Rejects NaN values or integers over 10 digits
let intLength = Math.round(num).toString().length;
return !isNaN(parseFloat(num));
}
function calcEval() {
// Operate with pair of numbers and display
numB = displayNum;
result = operate(operation, numA, numB);
setDisplay(result, undefined, true);
}
function clearValues() {
// Does NOT clear display values or history
numA = null;
numB = null;
operation = null;
await = true;
updateDecimalNode();
}
function formatNum(num) {
num = parseFloat(num);
if (num === 0) {
return 0
}
// SI notation for numbers larger than 10 significant figures
if (num >= 10 ** 10) {
return num.toPrecision(6);
}
let stripped = num.toString().replace(/[-]/g, "");
let intLength = Math.round(stripped).toString().length;
let newNum = Math.round(num * 10 ** (10 - intLength)) / 10 ** (10 - intLength)
// Number is too small to be displayed while rounded
if (newNum === 0) {
return num.toPrecision(6);
}
return newNum;
}
function updateDecimalNode() {
decimalNode.disabled = displayNode.textContent.includes(".");
}