Как вычислить формулу из строки в 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);
});