最近在使用DataTable装载数据,它的Compute的函数及列Expresiion表达式可很好的解决计算问题。
dt 包含reasonCode,reason,renum三列,其中renum列为数字类型。
1、Compute 计算
int reworkSum = 0;
object objSum = dt.Compute("sum(renum)","");
if (objSum != DBNull.Value && objSum != null)
{
reworkSum = Convert.ToInt32(objSum.ToString());
}
2、Expression表达式
dt增加列rate,计算占比,计算结果保留2位小数。
由于最后一行增加汇总,汇总比率值不需要计算,因此表达式中用iff判断列值是否为合计。
DataColumn column = new DataColumn("rate", typeof(string));
dt.Columns.Add(column);
column.Expression = "iif(reasoncode not in ('合计'),Convert(Convert(renum*10000/sum(renum),'System.Int32')/100,'System.String')+'%','')";
if (reworkSum > 0)
{
DataRow drN = dt.NewRow();
drN["reasoncode"] = "合计";
drN["renum"] = reworkSum;
dt.Rows.Add(drN);
}
Expression支持的函数:
len(reason);
substring(reason,1,3);//索引从1开始
convert(reasoncode,'System.Int32');//字符串转数字
renum/sum(renum);
max(renum)-renum;