javascript - переменную - string to operator js



Оценка строки в виде математического выражения в JavaScript (10)

// Вы можете сделать + или - легко:

function addbits(s){
    var total= 0, s= s.match(/[+\-]*(\.\d+|\d+(\.\d+)?)/g) || [];
    while(s.length){
        total+= parseFloat(s.shift());
    }
    return total;
}

var string='1+23+4+5-30';
addbits(string)

Более сложная математика делает eval более привлекательной - и, конечно, проще писать.

Как анализировать и оценивать математическое выражение в строке (например, '1+1' ), не вызывая eval(string) чтобы получить его числовое значение?

В этом примере я хочу, чтобы функция принимала '1+1' и возвращала 2 .


Answer #1

Альтернатива отличному ответу от @kennebec, использующая более короткое регулярное выражение и позволяющее пробелы между операторами

function addbits(s) {
    var total = 0;
    s = s.replace(/\s/g, '').match(/[+\-]?([0-9\.\s]+)/g) || [];
    while(s.length) total += parseFloat(s.shift());
    return total;
}

Используйте его как

addbits('5 + 30 - 25.1 + 11');

Обновить

Вот более оптимизированная версия

function addbits(s) {
    return (s.replace(/\s/g, '').match(/[+\-]?([0-9\.]+)/g) || [])
        .reduce(function(sum, value) {
            return parseFloat(sum) + parseFloat(value);
        });
}

Answer #2

Вы можете использовать библиотеку JavaScript Expression Evaluator , которая позволяет вам делать такие вещи, как:

Parser.evaluate("2 ^ x", { x: 3 });

Или mathjs , который позволяет такие вещи, как:

math.eval('sin(45 deg) ^ 2');

Я решил выбрать mathjs для одного из моих проектов.


Answer #3

Кто-то должен разбирать эту строку. Если это не интерпретатор (через eval ), то он должен быть вам, написание процедуры разбора для извлечения чисел, операторов и всего, что вы хотите поддержать в математическом выражении.

Итак, нет, нет простого (простого) способа без eval . Если вы беспокоитесь о безопасности (потому что ввод, который вы обрабатываете, не из источника, которым вы управляете), возможно, вы можете проверить формат ввода (через фильтр белого регулярного выражения), прежде чем передавать его на eval ?


Answer #4

Попробуйте AutoCalculator https://github.com/JavscriptLab/autocalculate Вычислить значение входов и вывод с помощью селекторных выражений

Просто добавьте атрибут для вашего выходного ввода, например data-ac = "(# firstinput + # secondinput)"

Нет необходимости в какой-либо инициализации, просто добавьте только атрибут data-ac. Он автоматически обнаружит динамически добавленные элементы

FOr add 'Rs' с выходом просто добавьте внутри фигурные скобки данные-ac = "{Rs} (# firstinput + # secondinput)"


Answer #5

Это небольшая функция, которую я собрал сейчас, чтобы решить эту проблему - она ​​вырабатывает выражение, анализируя строку один символ за раз (на самом деле это довольно быстро). Это займет какое-либо математическое выражение (ограничивается только +, -, *, / операторами) и возвращает результат. Он может обрабатывать отрицательные значения и операции с неограниченным числом номеров.

Единственное, что нужно сделать, это убедиться, что он вычисляет * & / before + & -. Добавит эту функциональность позже, но пока это делает то, что мне нужно ...

/**
* Evaluate a mathematical expression (as a string) and return the result
* @param {String} expr A mathematical expression
* @returns {Decimal} Result of the mathematical expression
* @example
*    // Returns -81.4600
*    expr("10.04+9.5-1+-100");
*/ 
function expr (expr) {

    var chars = expr.split("");
    var n = [], op = [], index = 0, oplast = true;

    n[index] = "";

    // Parse the expression
    for (var c = 0; c < chars.length; c++) {

        if (isNaN(parseInt(chars[c])) && chars[c] !== "." && !oplast) {
            op[index] = chars[c];
            index++;
            n[index] = "";
            oplast = true;
        } else {
            n[index] += chars[c];
            oplast = false;
        }
    }

    // Calculate the expression
    expr = parseFloat(n[0]);
    for (var o = 0; o < op.length; o++) {
        var num = parseFloat(n[o + 1]);
        switch (op[o]) {
            case "+":
                expr = expr + num;
                break;
            case "-":
                expr = expr - num;
                break;
            case "*":
                expr = expr * num;
                break;
            case "/":
                expr = expr / num;
                break;
        }
    }

    return expr;
}

Answer #6

Я недавно сделал это на C # (без Eval () для нас ...), оценив выражение в Reverse Polish Notation (это легкий бит). Трудная часть на самом деле разбирает строку и превращает ее в обратную польскую нотацию. Я использовал алгоритм Shunting Yard, потому что есть отличный пример в Википедии и псевдокоде. Мне было очень просто реализовать оба варианта, и я бы рекомендовал это, если вы еще не нашли решение или не смотрите на альтернативы.


Answer #7

Я пошел искать библиотеки JavaScript для оценки математических выражений и нашел этих двух перспективных кандидатов:

  • JavaScript Expression Evaluator : Меньше и, надеюсь, более легкий. Позволяет алгебраические выражения, подстановки и ряд функций.

  • mathjs : Позволяет mathjs комплексные числа, матрицы и единицы. Построен для использования как в браузере JavaScript, так и в Node.js.


Answer #8

Я считаю, что parseInt и ES6 могут быть полезны в этой ситуации

==> следующим образом:

let func = (str) => {
let arr = str.split("");
return `${Number(arr[0]) + parseInt(arr[1] + Number(arr[2]))}`};
console.log(func("1+1"));

Главное здесь, что parseInt анализирует число с помощью оператора. Код может быть изменен с учетом соответствующих потребностей.


Answer #9
const getAddition = (str) => {
  return str.split('+').reduce((total, num) => (total + num * 1), 0);
};

const addition = getAddition('1+1');

дополнение 2.





numbers