Javascript Jquery excel型动态公式计算

Javascript Jquery excel型动态公式计算,javascript,jquery,regex,excel,formulas,Javascript,Jquery,Regex,Excel,Formulas,我正在生成财务分析,并生成科目表的动态公式 示例 现金--可输入字段 短期投资——可输入字段 流动资产--公式字段,我为该@1~C:+@2~C: 应收票据--可输入字段 应收账款--可输入字段 债务准备金--可输入字段 应收账款净额--公式字段,我为该@4~C:+@5~C:+@6~C: 等等 我在文本框中计算聚焦out calculate\u year function calculate_year(ThisObj) { var obj; //in

我正在生成财务分析,并生成科目表的动态公式

示例

  • 现金--可输入字段
  • 短期投资——可输入字段
  • 流动资产--公式字段,我为该
    @1~C:+@2~C:
  • 应收票据--可输入字段
  • 应收账款--可输入字段
  • 债务准备金--可输入字段
  • 应收账款净额--公式字段,我为该
    @4~C:+@5~C:+@6~C:
  • 等等

    我在文本框中计算
    聚焦out calculate\u year

    function calculate_year(ThisObj) {
                var obj;
                //intiate vaiables
                var year_formulaTxt = "",resultExp ="",lastPos ="",sequenceTypePosC="",sequenceTypePosP="",sequenceTypePosF="",COACode="",COAValue="",ratio_formulaTxt = "";
                var ratio_formulaTxt = "",COACode_P="",COAValue_Pyear_formula = "",ratio_formula = "",year_formulaObj = "",ratio_formulaObj = "",year_formulaArr = "",ratio_formulaArr = "",FormulaResult="";
                //match paterm for 
                var matchPattern = /[^\s()*/%+-/]+/g;
                var tableId =  $(ThisObj).closest('table').attr('id');
                var CuurentDiv = $(ThisObj).closest('.program-column').index();
                 if (CuurentDiv < 2){   // to check if previous month added 
                         CuurentDiv = CuurentDiv + 1 ;
                    }
                var tableIdNext =  $('.mCSB_container .program-column:eq('+CuurentDiv+') table').attr('id');
    
                //get all textbox inside div
                $('#'+tableId+' .financial_txt').each(function () {
                    //º
                    obj = $(this);
    
                    year_formulaObj = obj.find('input[type=text]');
                    ratio_formulaObj= obj.find('input[type=text]:eq(1)');
    
                    //calcualtion for only formula fields
                    if ($(year_formulaObj).attr('data-fieldtype') == "F") {
    
                        //get formula from custom field
                        year_formula = $(year_formulaObj).attr('year_formula');
    
                        if($.trim(year_formula) !=""){
                            //match formula with math's operator(Binary operator)
                            year_formulaArr =  year_formula.match(matchPattern);
    
                            //break string @ º : working for single experssion using loop
                            // ----------------------For Year ---------------------------
                            for( var i=0; i< year_formulaArr.length; i++ ){
                                //sub string from '@'  to 'º'
                                lastPos = year_formulaArr[i].substring(1, year_formulaArr[i].length - 1);
    
                                //all sequence type
                                sequenceTypePosC = lastPos.indexOf("C");
                                sequenceTypePosP = lastPos.indexOf("P");
                                sequenceTypePosF = lastPos.indexOf("F");//
                                if(sequenceTypePosC >= 0){
                                //console.log(lastPos);
                                    //getting value of COACode From Formula
                                    COACode = lastPos.substring(0, sequenceTypePosC - 1);
    
                                    //getting value of COACode  From Text box id
                                    COAValue = $.trim($('#'+tableId+' #txt_year_formula'+COACode).val()) == "" ? 0 : $.trim($('#'+tableId+' #txt_year_formula'+COACode).val());
    
    
                                   $('#'+tableId+' #txt_year_formula'+COACode).val(COAValue);
    
                                    //work for field value
                                     var tempRes = year_formula.substring(year_formula.indexOf("@"), year_formula.indexOf("º")+1);
                                    year_formula = year_formula.replace(tempRes,COAValue);
                                    tempRes = year_formula;
                                    //replace rest of @ ,º with 0
                                    tempRes = tempRes.replace(/\s*@[^º]+º\s*/g,parseFloat(0));
    
                                    var result = parseFloat(mathEval(tempRes)).toFixed(3)|| 0;
    
                                    $('#'+tableId+' #txt_year_formula'+$(this).attr('id')).val(mathEval(result) == "NaN" ?"0":mathEval(result));
                                }
    
    
                            }
                        }
    
                   }
    
                });
    
            }
    function mathEval (exp) {
    
                    var reg = /(?:[a-z$_][a-z0-9$_]*)|(?:[;={}\[\]"'!&<>^\\?:])/ig,
                        valid = true;
                    // Detect valid JS identifier names and replace them
                    exp = exp.replace(reg, function ($0) {
                        // If the name is a direct member of Math, allow
                        if (Math.hasOwnProperty($0))
                            return "Math."+$0;
                        // Otherwise the expression is invalid
                        else
                            valid = false;
                    });
    
                    // Don't eval if our replace function flagged as invalid
                    if (!valid){
                        //console.log("Invalid arithmetic expression");
                        }
                    else{
                        try { return (eval(exp) == "Infinity" ? "0":eval(exp)); } catch (e) { };
    
                        }
            }
    
    我怎么办?对不起,我说英语

    如果你检查你会看到公式

    @8~Cº / @27~Cº