2015-04-07 8 views
12

Ich habe eine Tabelle, die Formel enthält. Beispiel für die Formel:Wie berechnet man Formel von String zu Int

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

In meinem Code mit jquery, ich werde GP1 mit Textbox1 Wert, GP2 mit Textbox2 Wert ersetzen und entfernen Sie die%.

Ich versuche, um das Ergebnis zu erhalten, indem dies zu tun:

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,""); 

==> also das letzte Ergebnis wird sein:

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

ich versuche, es zu konvertieren, dies zu sein int, indem Sie:

var result = parseInt(repl4); 

aber ich habe das Ergebnis NaN.

Kann jemand mir helfen, wie die Formel zur Berechnung

Danke.

+2

erster Druck repl4 zu überprüfen, was es returns.Is es eine Zeichenfolge oder spezielles Zeichen auftritt oder nicht. – Banik

+2

das Ergebnis der repl4 ist: (10/(10 + 0)) * 100. Ich möchte, dass das Endergebnis 1 ist. Gibt es das überhaupt, um das zu berechnen? – eikaz

+0

Ich denke, in Ihrem Beispiel Code über der ersten Zeile soll eine Zeichenfolge sein, aber es fehlen Anführungszeichen. – SGD

Antwort

8

Was Sie suchen ist:

var result = eval(repl4) 

Vorsicht aber wie jeder Javascript in repl4 wird ausgewertet und ausgeführt werden, das heißt, wenn jemand Typen bösartiger Javascript in Ihrem Textfeld wird es, wenn Sie es auswählen, erhalten ausgeführt .

Anwenden parseInt() auf die Wert der Texteingabe jedoch die Verwendung von eval() akzeptabel in Ihrem Beispiel macht, wie es für eine ganze Zahl oder NaN zurückkehrt somit jede Code-Injektion verhindert wird (unter Annahme natürlich, daß die Formel nicht von einem input kommenden auch).

+2

repl4 nicht rep14;) – Rouby

+0

danke für deine Hilfe @SGD .. es funktioniert gut .. – eikaz

+4

Nie, * nie *, 'eval()' Textfelder, genau aus dem hier angegebenen Grund. – LThode

1

Sie können var result = eval(repl4) verwenden. Dies wird das Formular auswerten und in result speichern.

1

Laufen parseInt((10/(10+0))*100); wird Ihnen die Antwort geben, die Sie wollen, weil es eine Zahl ist, aber parseInt kann die Zeichenfolge '(10/(10 + 0)) * 100' nicht in eine Zahl konvertieren (wahrscheinlich wegen der Nicht-numerische Zeichen

können Sie (wenn Sie müssen) umgehen mit eval, dh

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

2

nutzen eval nach dem Austausch Werte

var result = eval(repl4); 

und setzen Sie Ihren Ausdruck in Anführungszeichen sonst wird es zeigen Fehler wie GP Variable deklariert oder nicht gefunden

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

JSFiddle Demo

3

$("#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">

1

Hier ist eine schnelle jsFiddle, ich habe auch die missing radix parameter in Ihrem parseInt Methode zur Vollständigkeit hinzugefügt.

$(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); 

}); 
+2

Diese Antwort könnte mit einer Erklärung, wie es funktioniert ... – LThode

2

Die beste Lösung ist, einen dedizierten Parser zu verwenden, um den Ausdruck zu analysieren und später auszuwerten. Auf eval ist ein sehr einfacher Angriffsvektor für XSS-Angriffe.

Es gibt mehrere Mathematikbibliotheken, das folgende Beispiel verwendet math.js. Abhängig von Ihrem tatsächlichen Anwendungsfall, kann es ein Overkill sein und ein einfacher handgemachter Parser genügt.

Hinweis, dass ich noch ein wenig hacken musste, da math.js mit Prozentzeichen nicht zurechtkommt. Natürlich wäre ein besserer Weg, diese Funktionalität in math.js zu integrieren.

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>

+0

Gute Empfehlung, eine speziell gebaute Bibliothek zu verwenden! – psaxton