Оценка строки как математического выражения в JavaScript - PullRequest
56 голосов
/ 16 февраля 2010

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

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

Ответы [ 14 ]

1 голос
/ 15 июня 2017

Я считаю, что 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 анализирует число с оператором. Код может быть изменен для соответствующих нужд.

1 голос
/ 17 марта 2017

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

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

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

Для добавления 'Rs' с выводом просто добавьте фигурную скобку Данные-ас = "{} рупий (# firstinput + # secondinput)"

0 голосов
/ 31 марта 2018
const getAddition = (str) => {
  return str.split('+').reduce((total, num) => (total + num * 1), 0);
};

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

добавление 2.

0 голосов
/ 02 марта 2018

Вот алгоритмическое решение, подобное jMichael's, которое перебирает выражение символ за символом и последовательно отслеживает left / operator / right. Функция накапливает результат после каждого хода, она находит символ оператора. Эта версия поддерживает только операторы «+» и «-», но написана для расширения с другими операторами. Примечание: мы устанавливаем 'currOp' в '+' перед циклом, потому что мы предполагаем, что выражение начинается с положительного числа с плавающей запятой. На самом деле, в целом я предполагаю, что входной сигнал похож на то, что поступило бы от калькулятора.

function calculate(exp) {
  const opMap = {
    '+': (a, b) => { return parseFloat(a) + parseFloat(b) },
    '-': (a, b) => { return parseFloat(a) - parseFloat(b) },
  };
  const opList = Object.keys(opMap);

  let acc = 0;
  let next = '';
  let currOp = '+';

  for (let char of exp) {
    if (opList.includes(char)) {
      acc = opMap[currOp](acc, next);
      currOp = char;
      next = '';
    } else {
      next += char;
    } 
  }

  return currOp === '+' ? acc + parseFloat(next) : acc - parseFloat(next);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...