0

我正在努力使用grid具有可编辑单元格(CellEditing 插件)的 ExtJS 4.1.1。

一个人应该能够在单元格中输入数学公式,并且它应该将结果生成到字段的值中。例如:如果用户键入(320*10)/4返回值应该是800. 或者类似,如果用户键入(320m*10cm)/4函数应该从公式中去除非数学字符然后计算它。

我想用 RegExp 替换(或匹配),但我似乎无法让它工作。它不断返回 NaN,当我这样做时,console.log(e.value);它只返回我需要的originalValue而不是返回value

我没有太多要附加的代码:

onGridValidateEdit : function(editor,e,opts) {
    var str = e.value.toString();
    console.log(str);
    var strCalc = str.match(/0-9+-*\/()/g);
    console.log(strCalc);
    var numCalc = Number(eval(strCalc));
    console.log(numCalc);
    return numCalc;
},

返回:str=321 strCalc=null numCalc=0当我输入321*2.

任何帮助表示赞赏,

GR。


更新:

根据Paul Schroeder的意见,我创建了这个:

onGridValidateEdit : function(editor,e,opts) {
    var str = e.record.get(e.field).toString();
    var strCalc = str.replace(/[^0-9+*-/()]/g, "");
    var numCalc = Number(eval(strCalc));
    console.log(typeof numCalc);
    console.log(numCalc);
    return numCalc;
},

它计算了数字,但我无法将其打印回网格本身。它显示为“NaN”,即使在控制台中显示typeof=numbervalue=800.


最终代码:

这是有效的最终代码:

onGridValidateEdit : function(editor,e,opts) {
    var fldName = e.field;
    var str = e.record.get(fldName).toString();
    var strCalc = str.replace(/[^0-9+*-/()]/g, "");
    var numCalc = Number(eval(strCalc));
    e.record.set(fldName,numCalc);
},
4

1 回答 1

1

让我们分解这段代码。

onGridValidateEdit : function(editor,e,opts) {
    var str = e.value.toString();

这段代码在哪个监听器中使用?这对我们来说非常重要,这是我在插件中设置监听器的方式:

listeners: {
            edit: function(editor, e){
                var record = e.record;
                var str = record.get("your data_index of the value");
            }
        } 

以这种方式设置它对我有用,所以让我们继续:

   var strCalc = str.match(/0-9+-*\/()/g);
    console.log(strCalc);

此时strCalc=null,这也是正确的。str.match 返回 null 因为您的正则表达式与字符串中的任何内容都不匹配。我认为你想要做的是:

var strCalc = str.replace(/[^0-9+*-]/g, "");
console.log(strCalc);

这将更改它以替换字符串中不是您的方程式运算符和数字的所有字符。在那之后,我认为它应该适用于整数。我认为您实际上可能也想要十进制数字,但我想不出我头顶上的正则表达式( . 需要以某种方式转义),但它应该足够简单,可以在谷歌搜索中找到.

于 2012-07-11T15:25:34.287 回答