每个人都有自己的知识体系。
Toggle navigation
Home
随笔
C#/.Net
树莓派 / Raspberry
皓月汉化组
Beego
Golang
OxideMod
apache
haproxy
windows
Java
Objective-C
日语/罗马音歌词/日语常识
MongoDB
python
电学
公告
Minecraft服务器-公告
NanoPi
C4D (CINEMA 4D)
生活
推流/m3u8/rtmp/rtsp
Unity3d
ffmpeg
数据结构
区块链
tarui
UnityForPSVita
About Me
Archives
Tags
C# 对企业的任意动态工资核算公式解析规则 设计
2018-03-16 15:00:15
212
0
0
akiragatsu
由于在集团化公司企业内部 会对于组织架构复杂、 在不同的子公司、不同的部门、或者岗位 会套上不同的薪酬计算公式 财务/人事部门 在薪酬管理职能的需求上、 必然要进行若干套公式管理 既要满足、操作者能够录入普通数学公式 系统便于解析准确运算的情况下、 必然要做相应的设计 下面是我自己的一种设计思路 公式格式示例 [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 这里我写了一个最简单的参考性的 代码示例 (未考虑性能、仅思路演示) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HaoYue.DynamicMath { class Program { /// <summary> /// 动态公式解析和计算 代码实现 /// 研发部 皓月 /// </summary> /// <param name=\"args\"></param> static void Main(string[] args) { Console.WriteLine(\"【动态公式解析和计算 代码实现研究】\\n研发部 皓月\\n\\n\"); //用一个List集合 模拟待会儿查询数据库工资项集合 List <moneyproject> plist = new List<moneyproject>(); plist.Add(new moneyproject() { ProjectID = 1, Name = \"基本工资\", Number = 1500 }); plist.Add(new moneyproject() { ProjectID = 2, Name = \"绩效工资\", Number = 1000 }); plist.Add(new moneyproject() { ProjectID = 3, Name = \"奖金\", Number = 800 }); plist.Add(new moneyproject() { ProjectID = 4, Name = \"扣分项\", Number = 200 }); //公式字符串 string str = \"[PID:1]+[PID:2]+[PID:3]-[PID:4]+[NUM:100]\"; Console.WriteLine(\"公式字符串为:\" + str); do { int s_start = str.IndexOf(\"[\"); int s_end = str.IndexOf(\"]\"); if (s_start >= 0 && s_end > 0) { //取出变量值 string Mathstr = str.Substring(s_start,s_end - s_start + 1); Console.WriteLine(\"取出变量\"+Mathstr); string MathstrClear = Mathstr.Substring(1, Mathstr.Length - 2); Console.WriteLine(\"去掉符号\" + MathstrClear); //判断数据类型 string TypeString = MathstrClear.Substring(0, MathstrClear.IndexOf(\':\')); string ValueString = MathstrClear.Substring(MathstrClear.IndexOf(\':\') + 1); if (TypeString == \"PID\") { Console.WriteLine(\"类型为:工资项\"); Console.Write(\"查询对应工资项ID的值金额为:\"); var pinfo = plist.Where(w => w.ProjectID == Convert.ToInt32(ValueString)).FirstOrDefault(); Console.Write(pinfo.Number); Console.WriteLine(\"类型为:\"+pinfo.Name); //替换公式为实际数据 Console.WriteLine(\"替换公式为实际数据\"); str = str.Replace(Mathstr, pinfo.Number.ToString()); } else if (TypeString == \"NUM\") { Console.Write(\"类型为:常量 金额为:\"); Console.WriteLine(ValueString); //替换公式为实际数据 Console.WriteLine(\"替换公式为实际数据\"); str = str.Replace(Mathstr, ValueString); } Console.WriteLine(\"处理后公式为:\"+str); } else break; } while (str.IndexOf(\'[\') >= 0);//如果没有则不继续解析 Console.WriteLine(\"字符串解析并计算公式结果:\" + str); var finalvalue = new System.Data.DataTable().Compute(str, \"\"); Console.WriteLine(\"实际工资结果为:\"+ finalvalue); Console.ReadLine(); } public class moneyproject { public int ProjectID { get; set; } public string Name { get; set; } public float Number { get; set; } } } }
Pre:
Visual Studio Install 遇到 无法为字符“'”找到匹配的引号字符。
Next:
确保程序始终以管理员身份运行
0
likes
212
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Submit
Sign in
to leave a comment.
No Leanote account?
Sign up now.
0
comments
More...
Table of content
No Leanote account? Sign up now.