C#开发笔记之04-如何用C#优雅的计算个人所得税?
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/960 访问。
首先,要对个人所得税的计算方式了解之后再看本文。
个人所得税的计算使用任何计算机语言来实现都比较简单,关键是如何优雅的实现呢?我们的目标是消除大量难看的if语句。
方式1:请参考我的 C#设计模式 系列博文中行为型模式下的策略模式;
方式2:本案例通用使用一些技巧来加载计算个人所得税所依赖的数据,并用扩展方法来优雅的使用之。
public class TaxInfo {
public decimal Level { get; set; } = 0;//全月应纳税所得额
public decimal TaxRate { get; set; } = 0;//税率
public decimal QuickDeduction { get; set; } = 0;//速算扣除数
public TaxInfo(decimal level,
decimal taxRate,
decimal quickDeduction) {
Level = level;
TaxRate = taxRate;
QuickDeduction = quickDeduction;
}
}
首先我们定义一个计算个人所得税所依赖的数据,它包含所得额、税率和速算扣除数。
public static class TaxExtentions {
private const decimal EXEMPTION_VALUE = 3500m;
private static List<TaxInfo> _taxLevel = new List<TaxInfo>{
new TaxInfo(0, 0, 0),
new TaxInfo(1500, 0.03m, 0),
new TaxInfo(4500, 0.10m, 105),
new TaxInfo(9000, 0.20m, 555),
new TaxInfo(35000, 0.25m, 1005),
new TaxInfo(55000, 0.30m, 2755),
new TaxInfo(80000, 0.35m, 5505),
new TaxInfo(decimal.MaxValue, 0.45m, 13505)
};
public static decimal CalculateTax(this decimal income) {
var result = income - EXEMPTION_VALUE;
var taxInfo = _taxLevel[0];
for (int i = 1; i <= _taxLevel.Count - 1; i++) {
if (result > _taxLevel[i - 1].Level && result <= _taxLevel[i].Level) {
taxInfo = _taxLevel[i];
}
}
var tax = result * taxInfo.TaxRate - taxInfo.QuickDeduction;
Console.WriteLine($"Income = {income}," + $"tax = {tax}!");
return tax;
}
}
EXEMPTION_VALUE为免征额,本案例使用3500元,定义成常量是为了以后的修改方便。内部维持个人所得税等级列表,通过CalculateTax扩展方法计算税额。
public static void Main(string[] args) {
2500.00m.CalculateTax();
4900.00m.CalculateTax();
5500.00m.CalculateTax();
7000.00m.CalculateTax();
10000.00m.CalculateTax();
16000.00m.CalculateTax();
43000.00m.CalculateTax();
70000.00m.CalculateTax();
100000.00m.CalculateTax();
4500.00m.CalculateTax();
1986.00m.CalculateTax();
Console.ReadKey();
}
以上是调用方的代码,通过扩展方法使得代码非常精简,易于理解。以下是这个案例的输出结果:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/960 访问。
Income = 2500.00,tax = 0.00!
Income = 4900.00,tax = 42.0000!
Income = 5500.00,tax = 95.0000!
Income = 7000.00,tax = 245.0000!
Income = 10000.00,tax = 745.0000!
Income = 16000.00,tax = 2120.0000!
Income = 43000.00,tax = 9095.0000!
Income = 70000.00,tax = 17770.0000!
Income = 100000.00,tax = 29920.0000!
Income = 4500.00,tax = 30.0000!
Income = 1986.00,tax = 0.00!
本示例向大家演示了一种在分支众多的情况下的消除if语句的机制,并且使用更加优雅的方式来计算税额。
C#开发笔记之04-如何用C#优雅的计算个人所得税?的更多相关文章
- C#开发笔记,点点细微,处处真情,记录开发中的难言之隐
该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/956 访问. 概述 本系列文章将会向大家介绍本人实际开发过程中所遇到技术 ...
- 驱动开发学习笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇
驱动开发读书笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇下面这段摘自 linux源码里面的文档 : Documentatio ...
- TERSUS无代码开发(笔记04)-CSS样式设置
CSS样式设置 1.常用显示样式 大小尺寸 说明 间距边距 说明 各类颜色 说明 width 宽 margin 外边距 color 颜色 height 高 pad ...
- [Openwrt 项目开发笔记]:Openwrt平台搭建(一)
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...
- 开发笔记:基于EntityFramework.Extended用EF实现指定字段的更新
今天在将一个项目中使用存储过程的遗留代码迁移至新的架构时,遇到了一个问题——如何用EF实现数据库中指定字段的更新(根据UserId更新Users表中的FaceUrl与AvatarUrl字段)? 原先调 ...
- 【Cocos2d-x游戏引擎开发笔记(25)】XML解析
原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/9128819 XML是一种非常重要的文件格式,由于C++对XML的支持非常完善 ...
- PHP开发笔记
PHP开发笔记 JSON数据的解析 $json_data = isset($_GET['json_data']) ? $_GET['json_data'] : null; $json_data=str ...
- iOS回顾笔记(04) -- UIScrollView的基本使用详解
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- Java开发笔记(三十八)利用正则表达式校验字符串
前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...
随机推荐
- 集训作业 洛谷P1443 马的遍历
这个题是个搜索,而且有是最少的步数,肯定就是广搜啦,不知道为什么的同学先去学习一下广搜吧. 养成好习惯,看见最少步数就去想想广搜(只是我自己觉得) 竟然这个题可以如此顺畅的想到广搜,感觉不难啊,但还有 ...
- vue配置 less 全局变量
在使用Vue开发的过程中,通常会用到一些样式的全局变量,如果在每个组件中引入就太繁琐了,维护性也不好,因此全局引入是个不错的想法.下面以less为例,记录一下全局引入less变量的步骤: 1.首先安装 ...
- Disease Manangement 疾病管理
题目描述 Alas! \(A\) set of \(D (1 <= D <= 15)\) diseases (numbered \(1..D\)) is rshning through t ...
- Python 中的面向对象编程
面向对象编程(Object-oriented programming, OOP)是一种基于对象概念的编程范式,可包含属性(attribute)形式的数据以及方法(method)形式的代码.另一种对 O ...
- Captura - 免费好用还开源的录屏软件
首先下载这个软件,国内下载很慢这里提供一个国内下载UCloud-OSS 软件打开后默认英文,现在我们切换到中午模式 在录制屏幕的同时获取声音
- 我们通常这样使用Linux弱口令检测!
在Internet环境中,过于简单的口令是服务器面临的最大风险,对于管理员来说,即使找出这些弱口令账号是非常必要的,这样便于采取进一步的安全措施. 这里的话,弱口令检测需要用到一款密码破译软件--Jo ...
- pycharm控制台输出的日志全是红色的字体?
问题:logging在pycharm控制台输出的日志的字体全是红色的,怎么办? 图片描述: 解决办法:设置 -> 搜索“Console” -> 结果:改完立马生效
- vue学习(四) v-on:事件绑定
//html <div id="app"> <input type="button" value="ok" v-bind: ...
- 06 . ELK Stack + kafka集群
简介 Filebeat用于收集本地文件的日志数据. 它作为服务器上的代理安装,Filebeat监视日志目录或特定的日志文件,尾部文件,并将它们转发到Elasticsearch或Logstash进行索引 ...
- laravel 迁移文件中修改含有enum字段的表报错解决方法
解决方法: 在迁移文件中up方法最上方加上下面这一行代码即可: Schema::getConnection()->getDoctrineSchemaManager()->getDataba ...