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开发笔记(三十八)利用正则表达式校验字符串
前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...
随机推荐
- 微信小程序实战:app主页面保存page页面实例
先上代码. app.js //app.js App({ onLaunch: function () { // 登录 wx.login({ success: res => { if (this.g ...
- 【揭秘】阿里测试框架,各大CTO良心力荐
自动化测试因其节约成本.提高效率.减少手动干预等优势已经日渐成为测试人员的“潮流”,从业人员日益清楚地明白实现自动化框架是软件自动化项目成功的关键因素之一.本篇文章将从 什么是真正的自动化测试框架.自 ...
- 华为云如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 华为云如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载ap ...
- DNA Consensus String UVA - 1368
题目链接:https://vjudge.net/problem/UVA-1368 题意:给出一组字符串,求出一组串,使与其他不同的点的和最小 题解:这个题就是一个点一个点求,利用桶排序,求出最多点数目 ...
- 小白入门python新手教程python
python教程很多,但是需要自学教程更好一些,看自学python教程3遍,然后一步步操作,7天后就会有很大的收货. 要向数据处理方向走,数据处理需要网络爬虫的知识,且更加精进.下面是我从网上查找这方 ...
- HBase面试考点
HBase 架构图 组成部分及作用 Zookeeper在HBase中作用 Master的高可用 RegionServer的监控 元数据的入口 HMaster 不仅有维护集群元数据信息的功能,还能 通过 ...
- JavaScript运算符与流程控制
JavaScript运算符与流程控制 运算符 赋值运算符 使用=进行变量或常量的赋值. <script> let username = "YunYa"; < ...
- 十进制转换为其他进制(不使用format)
base = [str(x) for x in range(10)] + [chr(x) for x in range(ord('A'), ord('A') + 6)] # ['0', '1', '2 ...
- PHP array_key_exists() 函数
实例 检查键名 "Volvo" 是否存在于数组中: <?php $a=array("Volvo"=>"XC90","B ...
- HTML 布局 - 使用<div> 元素
网站布局 大多数网站会把内容安排到多个列中(就像杂志或报纸那样).高佣联盟 www.cgewang.com 大多数网站可以使用 <div> 或者 <table> 元素来创建多列 ...