您的位置:首页 > Web前端 > JavaScript

JS实现用户自定义计算公式

2010-02-06 16:30 615 查看
序号员工工种基本工资岗位补贴职务工资加班天数保险费实发工资
1per1高级
2per2普通
3per3高级
4per4普通
5per5高级
如上面表格,要做一个工资入录表单。最后的“实发工资”由录入数据的自动得到,而且还要根据用户自定义的公式得到。

例,用户按照程序设定的规则自定义了一个公式:

if ([工种] == '高级') then
g = [基本工资] + [岗位补贴] + [职务工资] + [加班天数] * 200 - [保险费];
else then
g = [基本工资] + [岗位补贴] + [职务工资] + [加班天数] * 100 - [保险费];

if (g ≤ 2000) then
[实发工资] = g;
else if (g > 2000 and g ≤ 3000) then
[实发工资] = g - 50;
else if (g > 3000) then
[实发工资] = g - 100;

表格是画出来的:
protected string DrawTable(DataSet dsPerson, DataSet dsWageItem)
{
string strTable = "<table id='tbWage'>";

for (int i = 0; i < dsPerson.Tables[0].Rows.Count; i++)
{
//画表头
if (i == 0)
{
strTable += "<tr><th>序号</th><th>员工</th><th>工种</th>";
for (int j = 0; j < dsWageItem.Tables[0].Rows.Count; j++)
{
strTable += "<th>" + dsWageItem.Tables[0].Rows[j]["FItemName"].ToString() + "</th>";
hdWageItem.Value += "|" + dsWageItem.Tables[0].Rows[j]["FItemName"].ToString();
}
strTable += "</tr>";

}

//画表体
strTable += "<tr>"
+ "<td ><label id='" + (i + 1) + "序号'>" + (i + 1) + "</label></td>"
+ "<td><label id='" + (i + 1) + "员工'>" + dsPerson.Tables[0].Rows[i]["personName"].ToString() + "</label></td>"
+ "<td><label id='" + (i + 1) + "工种'>" + dsPerson.Tables[0].Rows[i]["workingType"].ToString() + "</label></td>";
for (int k = 0; k < dsWageItem.Tables[0].Rows.Count; k++)
{
strTable += "<td><input type='text' id='" + (i + 1) + dsWageItem.Tables[0].Rows[k]["FItemName"].ToString() + "' value='' onchange=/"GetResult('" + (i + 1) + "')/" /></td>";
}
strTable += "</tr>";
}

strTable += "</table>";

return strTable;
}

根据用户自定义的公式得JS方法,只不过,这个方法是存到了字符串中的:
function GetJSExp()
{
var strH = ""; //JS公式的前半部分
var strM = ""; //JS公式的中间部分
var strE = ""; //JS公式的后半部分
var strRtn = ""; //JS公式最后返回值
var strExp = $("#txtExp").val(); //获取用户定义的公式

//获取工资项
var strWageItem = "";
$("#tbWage th").each(function(){
strWageItem += "|" + $(this).text();
});
if(strWageItem != "") strWageItem = strWageItem.substr(1);
var aryWageItem = strWageItem.split("|");

//处理用户定义的公式,得到JS公式的中间部分
strM = strExp.replace(/then/g,"")
.replace(/≤/g,"<=")
.replace(/≥/g,">=")
.replace(/and/g,"&&")
.replace(/or/g,"||")
.replace(/not/g,"!=")
.replace(//[/g,"")
.replace(//]/g,"")
.replace(//s+/g," ")
;

//循环处理工资项,得到JS的前后部分
for(i = 0; i < aryWageItem.length; i++)
{
//验证工资表中第一行的各个工资项,以此来判断工资项类型
if($('#1' + aryWageItem[i]).get(0).nodeName == 'LABEL') //当工资项是label时
{
strH += "var " + aryWageItem[i] + "=GObj(rI+'" + aryWageItem[i] + "').innerHTML;";
strE += "GObj(rI+'" + aryWageItem[i] + "').innerHTML=" + aryWageItem[i] + ";";
}
else if($('#1' + aryWageItem[i]).get(0).nodeName == 'INPUT') //当工资项是input.text时
{
strH += "var " + aryWageItem[i] + "=GF(GObj(rI+'" + aryWageItem[i] + "').value);";
strE += "GObj(rI+'" + aryWageItem[i] + "').value=isNaN(GF(" + aryWageItem[i] + "))?0:" + aryWageItem[i] + ";";
}
}

strRtn = "function GetResult(rI)"
+ "{"
+ strH + strM + strE
+ "}";

$("#txtRuslt").val(strRtn);
return strRtn;
}

把strRtn保存到数据库中,然后在test.aspx.cs获取这个字符串给strJS,在test.aspx中写上这段代码:

<script type="text/javascript">
var strJSExp = "<%= strJS%>";
if(strJSExp != "")
eval(strJSExp);
</script>

这段代码相当于在页面中定义了一个GetResult(rI)JS方法,使用表单中的文本框的onchange事件调用此方法,就会实现想要的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: