【发布时间】:2013-08-27 07:45:47
【问题描述】:
一段时间以来,我一直在研究解析公式的函数,但无法使其正常工作。它似乎并不总是有效 - 它过滤了文本的某些部分,但不是全部。
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(int) -
column(Ext.grid.column.Column) -
field(字符串) -
grid(Ext.grid.Panel) -
originalValue(字符串) -
record(Ext.data.Model) -
row(CSS 选择器) -
rowIdx(int) -
store(Ext.data.Store) -
value(字符串) -
view(Ext.grid.View)
目前无法让 JSFiddle 正常工作。
【问题讨论】:
-
问题是什么?
-
这和 Ext JS 有什么关系?
-
我想知道我在 RegEx 中做错了什么 - 如果有任何明显的错误。
-
这是我在 ExtJS 4.2.x 中使用的函数 - 用于评估网格中的字段。
-
一个建议:在您的问题中添加一个您想要解析的示例
formula。没有它,很难验证您尝试使用的正则表达式。这可能会帮助每个人更好地了解您想要完成的工作,并为您提供更多帮助。
标签: javascript regex