jquery exceltypes的dynamic公式计算

我正在产生财务分析,并为账目表生成dynamic公式。

  1. 现金– input能够领域
  2. 短期投资– input能力领域
  3. 液体资产– 公式字段 ,我为这个@1~Cº + @2~Cº产生公式
  4. 应收票据– 可input字段
  5. 应收帐款– 可input字段
  6. 拨备债务– input能力领域
  7. 净应收账款– 公式字段 ,我为这个@4~Cº + @5~Cº+@6~Cº生成公式

等等…

我正在计算文本框focusout calculate_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 = /(?:[az$_][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) { }; } } 

string中断,然后生成计算是函数calculate_year上的最佳方式?

正如你所看到的,我是从dynamic公式计算量,问题是有一些公式返回我无穷大,因为tempRes.replace(/\s*@[^º]+º\s*/g,parseFloat(0));

 @8~Cº / @27~Cº 

我怎么处理这个?对不起英文

工作链接

如果你检查你会看到公式。