C# 对企业的任意动态工资核算公式解析规则 设计

由于在集团化公司企业内部

会对于组织架构复杂、 
在不同的子公司、不同的部门、或者岗位 
会套上不同的薪酬计算公式

财务/人事部门 在薪酬管理职能的需求上、 
必然要进行若干套公式管理

既要满足、操作者能够录入普通数学公式 
系统便于解析准确运算的情况下、 
必然要做相应的设计

下面是我自己的一种设计思路

公式格式示例 
[PID:1]+[PID:2]-[PID:3]*[PID:4]/[NUM:1]

公式占位逻辑

工资项格式: 
[PID:项目编号ID]

常量: 
[NUM:常量值]

运算符 
+ - * /

比如

要实现的公式:基本工资+绩效工资+奖金+车费补贴100元

—————————————————— 
工资项目 | 工资项编号 
基本工资 | 1 
绩效工资 | 2 
奖金 | 3 
——————————————————

那么在程序中存储的表达式就为

[PID:1]+[PID:2]+[PID:3]+[NUM:100]

张三的基本工资2000、 
绩效工资800、 
奖金500

然后我们解析公式 
为 
2000+800+500+100

运算结果 
3400

这里我写了一个最简单的参考性的 代码示例 
(未考虑性能、仅思路演示)

 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace HaoYue.DynamicMath
  7. {
  8. class Program
  9. {
  10. /// <summary>
  11. /// 动态公式解析和计算 代码实现
  12. /// 研发部 皓月
  13. /// </summary>
  14. /// <param name=\"args\"></param>
  15. static void Main(string[] args)
  16. {
  17. Console.WriteLine(\"【动态公式解析和计算 代码实现研究】\\n研发部 皓月\\n\\n\");
  18. //用一个List集合 模拟待会儿查询数据库工资项集合
  19. List <moneyproject> plist = new List<moneyproject>();
  20. plist.Add(new moneyproject() { ProjectID = 1, Name = \"基本工资\", Number = 1500 });
  21. plist.Add(new moneyproject() { ProjectID = 2, Name = \"绩效工资\", Number = 1000 });
  22. plist.Add(new moneyproject() { ProjectID = 3, Name = \"奖金\", Number = 800 });
  23. plist.Add(new moneyproject() { ProjectID = 4, Name = \"扣分项\", Number = 200 });
  24. //公式字符串
  25. string str = \"[PID:1]+[PID:2]+[PID:3]-[PID:4]+[NUM:100]\";
  26. Console.WriteLine(\"公式字符串为:\" + str);
  27. do
  28. {
  29. int s_start = str.IndexOf(\"[\");
  30. int s_end = str.IndexOf(\"]\");
  31. if (s_start >= 0 && s_end > 0)
  32. {
  33. //取出变量值
  34. string Mathstr = str.Substring(s_start,s_end - s_start + 1);
  35. Console.WriteLine(\"取出变量\"+Mathstr);
  36. string MathstrClear = Mathstr.Substring(1, Mathstr.Length - 2);
  37. Console.WriteLine(\"去掉符号\" + MathstrClear);
  38. //判断数据类型
  39. string TypeString = MathstrClear.Substring(0, MathstrClear.IndexOf(\':\'));
  40. string ValueString = MathstrClear.Substring(MathstrClear.IndexOf(\':\') + 1);
  41. if (TypeString == \"PID\")
  42. {
  43. Console.WriteLine(\"类型为:工资项\");
  44. Console.Write(\"查询对应工资项ID的值金额为:\");
  45. var pinfo = plist.Where(w => w.ProjectID == Convert.ToInt32(ValueString)).FirstOrDefault();
  46. Console.Write(pinfo.Number);
  47. Console.WriteLine(\"类型为:\"+pinfo.Name);
  48. //替换公式为实际数据
  49. Console.WriteLine(\"替换公式为实际数据\");
  50. str = str.Replace(Mathstr, pinfo.Number.ToString());
  51. }
  52. else if (TypeString == \"NUM\")
  53. {
  54. Console.Write(\"类型为:常量 金额为:\");
  55. Console.WriteLine(ValueString);
  56. //替换公式为实际数据
  57. Console.WriteLine(\"替换公式为实际数据\");
  58. str = str.Replace(Mathstr, ValueString);
  59. }
  60. Console.WriteLine(\"处理后公式为:\"+str);
  61. }
  62. else
  63. break;
  64. } while (str.IndexOf(\'[\') >= 0);//如果没有则不继续解析
  65. Console.WriteLine(\"字符串解析并计算公式结果:\" + str);
  66. var finalvalue = new System.Data.DataTable().Compute(str, \"\");
  67. Console.WriteLine(\"实际工资结果为:\"+ finalvalue);
  68. Console.ReadLine();
  69. }
  70. public class moneyproject
  71. {
  72. public int ProjectID { get; set; }
  73. public string Name { get; set; }
  74. public float Number { get; set; }
  75. }
  76. }
  77. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值