calc.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /* eslint-disable */
  2. // 四则运算
  3. !(function () {
  4. var calculate = function (s) {
  5. s = s.trim();
  6. const stack = new Array();
  7. let preSign = '+';
  8. let numStr = '';
  9. const n = s.length;
  10. for (let i = 0; i < n; ++i) {
  11. if (s[i] === '.' || (!isNaN(Number(s[i])) && s[i] !== ' ')) {
  12. numStr += s[i];
  13. } else if (s[i] === '(') {
  14. let isClose = 1;
  15. let j = i;
  16. while (isClose > 0) {
  17. j += 1;
  18. if (s[j] === '(') isClose += 1;
  19. if (s[j] === ')') isClose -= 1;
  20. }
  21. numStr = `${calculate(s.slice(i + 1, j))}`;
  22. i = j;
  23. }
  24. if ((isNaN(Number(s[i])) && s[i] !== '.') || i === n - 1) {
  25. let num = parseFloat(numStr);
  26. switch (preSign) {
  27. case '+':
  28. stack.push(num);
  29. break;
  30. case '-':
  31. stack.push(-num);
  32. break;
  33. case '*':
  34. stack.push(stack.pop() * num);
  35. break;
  36. case '/':
  37. stack.push(stack.pop() / num);
  38. break;
  39. default:
  40. break;
  41. }
  42. preSign = s[i];
  43. numStr = '';
  44. }
  45. }
  46. let ans = 0;
  47. while (stack.length) {
  48. ans += stack.pop();
  49. }
  50. return ans;
  51. };
  52. module.exports = calculate;
  53. })();