@Seagul

Написал калькулятор без eval(). Насколько живуч этот подход?

Задался вопросом написать калькулятор обыкновенный. Реультат потыкать можно тут: https://fedorpereverzev.github.io/Calculator-witho... Самым простым решением было использовать eval(), но потом почитал, что это не лучшая идея. В итоге написал функцию, которая принимает на вход строку, разбивает ее на массив и по знаку производит вычисления
const antiEval = (str) => {

        let arr = str.split(' ');

        switch (arr[1]) {
            case '+':
                return Math.round((+arr[0] + +arr[2]) * 100) / 100;
                break;
            case '-':
                return Math.round((+arr[0] - +arr[2]) * 100) / 100;
                break;
            case '/':

                return Math.round((+arr[0] / +arr[2]) * 100) / 100;
                break;
            case '*':
                return Math.round((+arr[0] * +arr[2]) * 100) / 100;
                break;
        };
    };

Все ли в порядке с таким решением или это кривой велосипед?
Если что весь проект здесь: https://github.com/FedorPereverzev/Calculator-with...
  • Вопрос задан
  • 4110 просмотров
Решения вопроса 3
Kalombyr
@Kalombyr
По-моему лучше строить дерево...
Строку разбирать лучше в "пошаговом" режиме, т.е. смотреть на каждый символ и строить дерево.
Так как операции имеют свой приоритет, да ещё и скобки если будут, то простым массивом не отделаться.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
var value = '(5+7)*10'.match(/(^[0-9*\/\\(\\)+-]+$)/);
var res = new Function('return '+ value );
console.log(res()); // => 120
или
Используйте обратную польскую запись.
Ответ написан
@SimasikS
Я есть
Есть такая штука как Builder.
Что-то типа:
class Calc{
 public float Result;

 public Calc Add(float a){
  Result += a;
  return this;
 }

 public float GetResult() {
  return Result;
 }
}

Использовать можно как-то так
var a = new Calc().Add(2).Add(5).Minus(4).GetResult();

Только вот это всё нужно делать, парься, что вам там пользователи навводили

Адаптировать под JS, я думаю, сможете
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы