我一直在研究一个解析公式的函数,但一直无法使其正常工作。它似乎并不总是有效 - 它过滤了文本的某些部分,但不是全部。
parseFormula(e) {
var formula = e.value, value = 0.00, tValue = 0.00, tFormula = '', dObj = {};
if(formula !== undefined && formula !== "") {
dObj._formulaIn = formula;
var f = formula.split(/\s/g);
for(var i = 0; i < f.length; i++) {
tFormula = f[i];
// Replacing PI
tFormula = tFormula.replace(/(pi)/gi,Math.PI);
dObj._1_pi_done = tFormula;
// Replacing Squareroot with placeholder
tFormula = tFormula.replace(/(sqrt)/gi,"__sqrt__");
tFormula = tFormula.replace(/(sqr)/gi,"__sqrt__");
tFormula = tFormula.replace(/(kvrt)/gi,"__sqrt__");
tFormula = tFormula.replace(/(kvr)/gi,"__sqrt__");
dObj._2_sqrt_done = tFormula;
// Removing units that may cause trouble
tFormula = tFormula.replace(/(m2||m3||t2||t3||c2||c3)/gi,"");
dObj._3_units_done = tFormula;
// Removing text
tFormula = tFormula.replace(/\D+[^\*\/\+\-]+[^\,\.]/gi,"");
dObj._4_text_done = tFormula;
// Removing language specific decimals
if(Language.defaultLang === "no_NB") {
tFormula = tFormula.replace(/(\.)/gi,"");
tFormula = tFormula.replace(/(\,)/gi,".");
} else {
tFormula = tFormula.replace(/(\,)/gi,"");
}
dObj._5_lang_done = tFormula;
// Re-applying Squareroot
tFormula = tFormula.replace(/(__sqrt__)/g,"Math.sqrt");
dObj._6_sqrt_done = tFormula;
if(tFormula === "") {
f.splice(i,1);
} else {
f[i] = tFormula;
}
dObj._7_splice_done = tFormula;
console.log(dObj);
}
formula = "";
for(var j = 0; j < f.length; j++) {
formula += f[j];
}
try {
value = eval(formula);
}
catch(err) {}
return value === 0 ? 0 : value.toFixed(4);
} else {
return 0;
}
}
我不确定此函数中使用的任何正则表达式,因此我寻求帮助。例如,我不确定是否/(pi)/
是获取确切文本“pi”并将其替换为 3.141 的正确方法。
(我eval
目前正在使用,但它仅用于开发)
任何帮助表示赞赏。
编辑:
我试图解析的公式是用户输入公式。他/她会在哪里输入类似的内容:2/0.6 pcs of foo * pi bar + sqrt(4) foobar
. 我希望它去除所有非数学字母并计算其余部分。这意味着上面的公式将被解释为(2/0.6) * 3.141 + Math.sqrt(4)
=>12.47
编辑2:
e
是一个 ExtJS 对象,由网格中的一个字段传递,它包含以下变量:
colIdx
(整数)column
( Ext.grid.column.Column )field
(细绳)grid
( Ext.grid.Panel )originalValue
(细绳)record
( Ext.data.Model )row
(CSS选择器)rowIdx
(整数)store
( Ext.data.Store )value
(细绳)view
( Ext.grid.View )
我目前无法让 JSFiddle 正常工作。