C#月数计算器(主要用于社保、医保缴费月数计算)

1、为什么做这个?

  工作中,经常需要计算参保人社保、医保缴费月数,之前都是在Excel中写一个DATEDIF公式,修改单元格中的日期,计算间隔的月数,公式如下:

=DATEDIF(起始日期, 终止日期, 返回类型) 

4bda0c55042e414a8f294d58690afc28.jpeg

或者

a44fb3d1c74447f5a65e0a7a9b4154cf.jpeg

   看起来,这样做也挺方便,但每次录入前,需要用鼠标点击相应单元格,清除内容,录入……计算得多了,仍然感觉很麻烦,于是,决心做一个“计算器”。

2、制作思路

  这个计算器,主打一个“方便”,所以界面要简洁,功能要强大,功能主要做2个:

  • 根据2个日期,计算相距的月数
  • 根据1个日期,计算其之前或之后n个月的日期

  在这里,我设置了3种计算方式:共计、相差、间隔,在工作中,“共计”模式用的最多。

  • 共计:从年月a数到年月b,一共有多少个月,例如从2008年1月至2008年9月,计算结果为9;
  • 相差:从年月a到年月b,差着几个月,例如从2008年1月至2008年9月,计算结果为8;
  • 间隔:从年月a到年月b,中间隔着几个月,例如从2008年1月至2008年9月,计算结果为7。

  为方便使用,年月a和年月b自动比较大小,录入时无需考虑哪个在前哪个在后。

3、绘制界面

27fdb3d683f1489aae5b58efab6c7e92.jpeg

  界面分为上下两部分,上面是按2个【年月】计算【月数】,下面是按【年月一】+【月数】计算【年月二】。

  计算方式那里用了ComboBox,下拉选择,年月输入框使用的TextBox,后续计算时要对有效性进行校验。

  为方便操作,对控件的OnKeyPress事件进行了设置,实现用回车键切换文本框,对窗体的CancelButton进行了设置,实现用ESC键清空内容。

4、功能实现

直接粘上用到的2个方法

        /// <summary>/// 按【年月一】+【月数】计算【年月二】/// </summary>/// <param name="ym1">【年月一】</param>/// <param name="monthsCount">【月数】</param>/// <param name="jisuanfangshi">计算方式</param>/// <param name="Msg">存放错误信息</param>/// <returns>【年月二】</returns>private DateTime calMonth(DateTime ym1, int monthsCount, string jisuanfangshi, out string Msg){DateTime dtResult = new DateTime();try{dtResult = ym1.AddMonths(monthsCount);Msg = "";}catch(Exception ex){Msg = ex.Message;}return dtResult;}/// <summary>/// 按2个【年月】计算【月数】/// </summary>/// <param name="start">【年月一】</param>/// <param name="end">【年月二】</param>/// <param name="jisuanfangshi">计算方式</param>/// <param name="Msg">存放说明信息<</param>/// <returns>【月数】</returns>private int cal(DateTime start, DateTime end, string jisuanfangshi, out string Msg){int result = -1;Msg = "";if (start > end){DateTime tmpDT = end;end = start;start = tmpDT;}int endMonth = end.Month;int startMonth = start.Month;int endYear = end.Year;int startYear = start.Year;if (endMonth < startMonth){endYear -= 1;endMonth += 12;}result = 12 * (endYear - startYear) + endMonth - startMonth;switch (jisuanfangshi){case "共计":result += 1;break;case "间隔":result -= 1;if (result < 0){result = 0;}break;case "相差":break;}if (result > 12){Msg = (result / 12).ToString() + "年" + (result % 12).ToString() + "个月";}return result;}

按日期计算月数

        private void btnCal_Click(object sender, EventArgs e){if (!Regex.IsMatch(txtStart.Text, @"^\d{6}$")){MessageBox.Show("起始年月格式{yyyyMM}录入有误!请检查!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);txtStart.Focus();return;}if (!Regex.IsMatch(txtEnd.Text, @"^\d{6}$")){MessageBox.Show("截止年月格式{yyyyMM}录入有误!请检查!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);txtEnd.Focus();return;}try{DateTime dt1 = new DateTime(int.Parse(txtStart.Text.Substring(0, 4)), int.Parse(txtStart.Text.Substring(4, 2)), 1);DateTime dt2 = new DateTime(int.Parse(txtEnd.Text.Substring(0, 4)), int.Parse(txtEnd.Text.Substring(4, 2)), 1);string info = "";txtResult.Text = cal(dt1, dt2, cmbCal.Text,out info).ToString();if (info.Length > 0){lblInfo.Text = "个月 即 " + info;}else{lblInfo.Text = "个月";}}catch{MessageBox.Show("日期转换出错,请检查!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);return;}}

按一个日期+月数计算另一个日期

        private void btnCalMonth_Click(object sender, EventArgs e){DateTime dtFirst;try{dtFirst = new DateTime(int.Parse(txtYMA.Text.Substring(0, 4)),int.Parse(txtYMA.Text.Substring(4, 2)),1);}catch{MessageBox.Show("【起始年月】填写有误!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);txtYMA.Focus();return;}if (txtNumYear.Text.Length == 0 && txtNumMonth.Text.Length == 0){MessageBox.Show(cmbCountMonth.Text+"【月数】未填写!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);txtNumYear.Focus();return;}int monthCount = 1;if (cmbCalMonth.Text == "间隔"){monthCount = -1;}if (cmbCalMonth.Text == "相差"){monthCount = 0;}if(Regex.IsMatch(txtNumYear.Text,@"^\d+$")){monthCount-=int.Parse(txtNumYear.Text)*12;}if(Regex.IsMatch(txtNumMonth.Text,@"^\d+$")){monthCount-=int.Parse(txtNumMonth.Text);}if (cmbCountMonth.Text == "后"){monthCount *= -1;}DateTime dtResult = dtFirst.AddMonths(monthCount);txtResultCount.Text = dtResult.ToString("yyyyMM");}

感兴趣的朋友可以动手做一个,试一下!
下载源码https://download.csdn.net/download/W2KExp/88094039

d452f57f3f57477f82a758431bfbe905.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【wxWidgets】剪贴板和拖放操作

【wxWidgets】剪贴板和拖放操作 使用剪贴板传输数据时应用程序间的一种交互方式 剪贴板和拖放操作在wxWidgets中共享了一些类来实现数据的传输 数据对象 wxDataObject类时剪贴板操作和拖放操作的核心&#xff0c;该类实例代表了拖放操作中鼠标拖拽的事物和剪贴板中拷贝和粘贴…

Stephen Wolfram:一次只添加一个词

It’s Just Adding One Word at a Time 一次只添加一个词 That ChatGPT can automatically generate something that reads even superficially like human-written text is remarkable, and unexpected. But how does it do it? And why does it work? My purpose here is t…

mysql进阶1——proxysql中间件

文章目录 一、基本了解二、安装部署三、proxysql管理配置3.1 内置库3.1.1 main库表3.1.2 stats库表3.1.3 monitor库 3.2 常用管理变量3.2.1 添加管理用户3.2.2 添加普通用户3.2.3 修改监听套接字 四、多层配置系统4.1 系统结构4.2 修改变量加载配置4.3 启动加载流程 一、基本了…

单机和集群以及分布式的浅析

假设一个大系统分为A、B、C、D、E五个模块&#xff0c;也可以认为是五个基本的服务&#xff0c;该系统靠这五个模块协同工作&#xff0c;共同为用户提供服务。 单机 单机&#xff1a;显然&#xff0c;单机表名该系统完完全全的部署在该台机器上&#xff0c;拥有完整的服务&am…

集成学习——Boosting算法:Adaboost、GBDT、XGBOOST和lightGBM的简要原理和区别

1、Boosting算法 Boosting算法是通过串联的方式&#xff0c;将一组弱学习器提升为强学习器算法。它的工作机制如下&#xff1a; &#xff08;1&#xff09;用初始训练集训练出一个基学习器&#xff1b; &#xff08;2&#xff09;依据基学习器的表现对训练样本分布进行调整&…

opencv 图像距离变换 distanceTransform

图像距离变换&#xff1a;计算图像中每一个非零点距离离自己最近的零点的距离&#xff0c;然后通过二值化0与非0绘制图像。 #include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, dst, dst…

洛必达法则和分部积分的应用之计算数学期望EX--概率论浙大版填坑记

如下图所示&#xff0c;概率论与数理统计浙大第四版有如下例题&#xff1a; 简单说就是&#xff1a;已知两个相互独立工作电子装置寿命的概率密度函数&#xff0c;将二者串联成整机&#xff0c;求整机寿命的数学期望。 这个题目解答中的微积分部分可谓是相当的坑爹&#xff0c;…

vue/cli 自定义配置

vue/cli 自定义配置 1、更改默认的端口号8080 只需要更改vue.config.js文件 1、更改默认的端口号8080 只需要更改vue.config.js文件

脑电信号处理与特征提取——4.脑电信号的预处理及数据分析要点(彭微微)

目录 四、脑电信号的预处理及数据分析要点 4.1 脑电基础知识回顾 4.2 伪迹 4.3 EEG预处理 4.3.1 滤波 4.3.2 重参考 4.3.3 分段和基线校正 4.3.4 坏段剔除 4.3.5 坏导剔除/插值 4.3.6 独立成分分析ICA 4.4 事件相关电位&#xff08;ERPs&#xff09; 4.4.1 如何获…

什么是UE像素流送,像素流推流是什么原理?

游戏开发者通常在运行游戏逻辑时会将游戏渲染到屏幕的同一台设备上来运行虚幻引擎应用&#xff0c;多人联网游戏可能会在应用程序的多个实例之间分发部分游戏逻辑&#xff0c;但每个单独的实例仍然会为自己的玩家在本地渲染游戏。即使是使用 HTML5 部署选项创建可以在 Web 浏览…

解决@Scope(“prototype“)不生效的问题

目录 Scope(“prototype“)不生效Scope(“prototype“)正确用法——解决Bean多例问题 1.问题&#xff0c;Spring管理的某个Bean需要使用多例2.问题升级3. Spring给出的解决问题的办法&#xff08;解决Bean链中某个Bean需要多例的问题&#xff09; Scope(“prototype“)不生效 …

【ribbon】Ribbon的使用与原理

负载均衡介绍 负载均衡&#xff08;Load Balance&#xff09;&#xff0c;其含义就是指将负载&#xff08;工作任务&#xff09;进行平衡、分摊到多个操作单元上进行运行&#xff0c;例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等&#xff0c;从而协同…

【《Go编程进阶实战:开发命令行应用、HTTP应用和gRPC应用》——指导你使用Go语言构建健壮的、生产级别的应用程序】

谷歌在2009年发布了Go编程语言&#xff0c;并于2012年发布了1.0版。Go语言具有强大的兼容性&#xff0c;一直用于编写可扩展的重量级程序(命令行应用程序、关键基础设施工具乃至大规模分布式系统)。凭借简单性、丰富的标准库和蓬勃发展的第三方软件包生态系统&#xff0c;Go语言…

工程安全监测无线振弦采集仪在建筑物中的应用

工程安全监测无线振弦采集仪在建筑物中的应用 工程安全监测无线振弦采集仪是一种用于建筑物结构安全监测的设备&#xff0c;它采用了无线传输技术&#xff0c;具有实时性强、数据精度高等优点&#xff0c;被广泛应用于建筑物结构的实时监测和预警。下面将从设备的特点、应用场…

FPGA中RAM的结构理解

FPGA中RAM的结构理解 看代码的过程中对RAM的结构不是很理解&#xff0c;搞脑子一片浆糊&#xff0c;反复推算&#xff0c;好不容易理清了思路&#xff0c;记录下来&#xff0c;防止忘记。开辟的RAM总容量为128bytes&#xff0c;数据的位宽为32位&#xff08;即一个单元有32bit…

Linux の shell 基本语法

变量 shell中变量比较特殊&#xff0c;变量名和等号之间不能有空格。其它的跟常见的变成语言类似 命名规则&#xff1a; 命名只能使用英文字母&#xff0c;数字和下划线&#xff0c;首个字符不能以数字开头。 中间不能有空格&#xff0c;可以使用下划线 _。 不能使用标点符号。…

Flask 创建文件目录,删除文件目录

项目结构 app.py from flask import Flask, render_template, request, redirect, url_for import osapp Flask(__name__) BASE_DIR os.path.abspath(os.path.dirname(__file__)) FILE_DIR os.path.join(BASE_DIR, testfile)app.route(/, methods[GET, POST]) def index():…

jenkins

Gitlab添加钩子 测试钩子 添加完成后&#xff0c;下面会出现钩子选择。点击test中的&#xff0c;push event。 出现successful&#xff0c;既添加成功。 如果添加失败&#xff0c;报错&#xff0c;更改Network

JMerter安装配置以及使用(笔记记录)

JMerter安装配置以及使用&#xff08;笔记记录&#xff09; 安装JDK安装JMeterJMeter使用元件执行的顺序参数详解参数配置之CSV数据文件设置断言响应断言JSON断言 数据提取XPath提取器JSON提取器 JMeter属性JMeter录制脚本JMeter直连数据库逻辑控制器如果&#xff08;IF&#x…

数据库概述和DDL语句(学会并使用数据库day1)

数据库概述和DDL语句&#xff08;day1&#xff09; 一、数据库概述概念数据库的集中式控制有什么优点数据库分类mysql数据库mysql简介基本术语数据表的组成 数据库管理系统数据库管理系统、数据库和表的关系 二、SQL的概念三、SQL语句分类1、SQL语句被分为四大类2、MySQL的语法…