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开发笔记(三十八)利用正则表达式校验字符串
前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...
随机推荐
- Lucas定理 & Catalan Number & 中国剩余定理(CRT)
又双叒叕来水数论了 今天来学习\(Lucas \:\ \& \:\ Catalan Number\) 两者有着密切的联系(当然还有CRT),所以放在一起学习一下 \(Lucas\) 定义\(\ ...
- windows如何解决Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion'
问题再现与解读 首次,使用 java 命令+任意参数 都会报这个错误,最典型的就是java -version 解读一下这个报错信息,注册表路径 Software\JavaSoft\Java Runti ...
- linux nginx 部署多套服务(以react包为例)
前言 今天我特地写下笔记,希望可以完全掌握这个东西,也希望可以帮助到任何想对学习这个东西的同学. 本文用nginx部署服务为主要内容,基于CentOs 7.8系统. 文档版本:1.0.1 更新时间:2 ...
- Java 并发实践 — ConcurrentHashMap 与 CAS
转载 http://www.importnew.com/26035.html 最近在做接口限流时涉及到了一个有意思问题,牵扯出了关于concurrentHashMap的一些用法,以及CAS的一些概念. ...
- 深度搜索---------Lake counting
#include<iostream>#include<cstdio>#include<cstdlib>#define maxn 100char ch[maxn][m ...
- Java环境变量设置:Path、CLASSPATH、JAVA_HOME的作用分别是什么?
1.Path 作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找百看是否能找到相应的命令程序. 需要把jdk安装目录下的b ...
- Pyramid attention networks for image restoration
paper:https://arxiv.org/abs/2004.13824 code: https://github.com/SHI-Labs/Pyramid-Attention-Networks ...
- Linux下给PHP安装redis扩展
一.下载redis扩展源码包 PHP官网下载地址:http://pecl.php.net/package/redis 二.安装依赖插件 yum -y install wget make gcc gcc ...
- adb常用命令大全
1. 显示系统中全部Android平台: android list targets2. 显示系统中全部AVD(模拟器): 启动制定模拟器:emulator -avd 模拟器名字 andr ...
- 01_Linux基础篇
学于黑马.传智播客.尚硅谷 感谢 黑马官网 传智播客官网 尚硅谷官网 微信搜索"艺术行者",关注并回复关键词"linux"获取视频和教程资料! b站在线视频 第 ...