Как вычислить формулу из строки в int

У меня есть таблица, содержащая формулу. Пример формулы:

(GP1/(GP1 + GP2)) * 100%.

В моем коде с использованием jquery, я заменил GP1 значением textbox1, GP2 значением textbox2 и удалит%.

Я пытаюсь получить результат, выполнив следующее:

var repl1 = (GP1/(GP1 + GP2))*100%;
var repl2 = repl1.replace(/GP1/gi,parseInt($("#txtbox1").val()));
var repl3 = repl2.replace(/GP2/gi,parseInt($("#txtbox2").val()));
var repl4 = repl3.replace(/%/gi,"");

== > , поэтому последним результатом будет:

 var repl4 = (10/(10+0))*100

Я пытаюсь преобразовать его в int, выполнив следующее:

var result = parseInt(repl4);

Но я получаю результат NaN.

Может кто-нибудь помочь мне в том, как рассчитать формулу

Спасибо.

Ответ 1

Что вы ищете:

var result = eval(repl4)

Будьте осторожны, так как любой Javascript в repl4 будет оцениваться и выполняться, т.е. если кто-то вводит вредоносный Javascript в ваше текстовое поле, он будет выполнен, если вы его не фильтруете.

Применяя parseInt() к значениям ввода текста, сделайте использование eval() приемлемым в вашем примере, поскольку оно вернет целое число или NaN, что предотвратит любую инъекцию кода (это предполагает, конечно, что формула не из input).

Ответ 2

$("#btnCal").click(function(){
var repl1 = "(GP1/(GP1 + GP2))*100%";
var repl2 = repl1.replace(/GP1/gi,parseInt($("#txt1").val()));
var repl3 = repl2.replace(/GP2/gi,parseInt($("#txt2").val()));
var repl4 = repl3.replace(/%/gi,"");
  alert(eval(repl4));
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" id="txt1">
<input type="text" id="txt2">



<input type="button" id="btnCal" value="calculate">

Ответ 3

использовать eval после замены значений

var result = eval(repl4);

и поместите свое выражение в кавычки, иначе оно будет показывать ошибку, как переменная GP, не объявленная или найденная

var repl1 = "(GP1/(GP1 + GP2))*100%";

JSFiddle Demo

Ответ 4

Лучшее решение - использовать выделенный синтаксический анализатор для синтаксического анализа и последующей оценки выражения. Опираясь на eval - очень простой вектор атаки для атак XSS.

Существует несколько библиотек математики, в следующем примере используется math.js. В зависимости от вашего фактического прецедента, это может быть излишний, и достаточно простого парсера с одной функцией.

Примечание, что мне все равно пришлось включить небольшой взлом, так как math.js не может справиться с процентными знаками. Конечно, лучшим способом было бы включить эту функциональность в math.js.

var calculate = document.getElementById("calculate"),
  formula = document.getElementById("formula"),
  gp1 = document.getElementById("gp1"),
  gp2 = document.getElementById("gp2"),
  result = document.getElementById("result");


calculate.addEventListener("click", function() {
  var expr = formula.value.replace(/%/, "*(1/100)");
  result.value = math.eval(expr, {
    GP1: parseInt(gp1.value, 10),
    GP2: parseInt(gp2.value, 10)
  });
});
GP1:
<input type="number" id="gp1" value="123" />
<br>GP2:
<input type="number" id="gp2" value="456" />Formula:
<input type="text" id="formula" value="(GP1/(GP1 + GP2))*100%" />
<hr>
<button id="calculate">Calculate!</button>
<br>Result:
<output>
  <input type="number" readonly="readonly" id="result" />
</output>

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/1.5.0/math.min.js"></script>

Ответ 5

Вы можете использовать var result = eval(repl4). Это оценит формулу и сохранит ее в result.

Ответ 6

Запуск parseInt((10/(10+0))*100); даст вам ответ, который вы хотите, потому что это число, однако parseInt не может преобразовать строку '(10/(10 + 0)) * 100' в число (скорее всего, из-за нецифровых символов.

вы можете (если вам нужно) обойти его, используя eval, т.е.

parseInt(eval('(10/(10+0))*100'));

Ответ 7

Вот быстрый jsFiddle, я также добавил отсутствует параметр radix в вашем методе parseInt для полноты.

$(document).on('click', 'button', function () {

var repl1 = '(GP1/(GP1 + GP2)) * 100%';

var repl2 = repl1.replace(/GP1/gi, parseInt($('#txtbox1').val(), 10));
var repl3 = repl2.replace(/GP2/gi, parseInt($('#txtbox2').val(), 10));
var repl4 = repl3.replace(/%/gi, "");

$('#result').html(repl4);

});