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#优雅的计算个人所得税?的更多相关文章

  1. C#开发笔记,点点细微,处处真情,记录开发中的难言之隐

    该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/956 访问. 概述 本系列文章将会向大家介绍本人实际开发过程中所遇到技术 ...

  2. 驱动开发学习笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇

    驱动开发读书笔记. 0.04  linux 2.6 platform device register 平台设备注册  1/2 共2篇下面这段摘自 linux源码里面的文档 : Documentatio ...

  3. TERSUS无代码开发(笔记04)-CSS样式设置

    CSS样式设置 1.常用显示样式 大小尺寸 说明  间距边距 说明  各类颜色 说明  width 宽 margin 外边距         color  颜色        height 高 pad ...

  4. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

  5. 开发笔记:基于EntityFramework.Extended用EF实现指定字段的更新

    今天在将一个项目中使用存储过程的遗留代码迁移至新的架构时,遇到了一个问题——如何用EF实现数据库中指定字段的更新(根据UserId更新Users表中的FaceUrl与AvatarUrl字段)? 原先调 ...

  6. 【Cocos2d-x游戏引擎开发笔记(25)】XML解析

    原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/9128819 XML是一种非常重要的文件格式,由于C++对XML的支持非常完善 ...

  7. PHP开发笔记

    PHP开发笔记 JSON数据的解析 $json_data = isset($_GET['json_data']) ? $_GET['json_data'] : null; $json_data=str ...

  8. iOS回顾笔记(04) -- UIScrollView的基本使用详解

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  9. Java开发笔记(三十八)利用正则表达式校验字符串

    前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...

随机推荐

  1. Vue JSX、自定义 v-model

    ​博客地址:https://ainyi.com/92 最初用到 JSX,就是做这个博客的时候.iview 表格组件,不支持像 element 那样直接写 html 代码渲染,只能通过 render 函 ...

  2. Python Ethical Hacking - Malware Packaging(3)

    Convert Python Programs to OS X Executables https://files.pythonhosted.org/packages/4a/08/6ca123073a ...

  3. vue 应用 : 计数器组件

    <template> <div class="input-number"> <div @click="sub" :class=&q ...

  4. PyQt5基础控件

    QLabel标签 功能:在界面上显示文字.图片.链接等 接口: 方法 描述 setText() 设置显示的内容 setAlignment() 设置文字对齐方式 setToolTip() 设置提示信息 ...

  5. abp vnext 开发快速入门 3 实现权限控制

    上篇讲了abp vnext 实现了简单的增加操作的例子.删除更新查询基本类似,这里就不讲了,接下来说下如何实现角色权限控制. 再说之前,先说下如果想更加透彻的理解abp vnext的权限控制,最好是先 ...

  6. javac不是内部或外部命令,也不是可运行的程序或批处理文件的错误解决方法(Windows10/Windows7)

    前言:在配置JDK环境变量后,java显示正常,javac则显示javac不是内部或外部命令,也不是可运行的程序或批处理文件.造成javac不是内部或外部命令,也不是可运行的程序或批处理文件的问题一般 ...

  7. 阿里云如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?

    阿里云如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 见如上链接中视频

  8. .Net Core Controller

    [HttpGet] public async Task<ActionResult<IEnumerable<ABBUserModel>>> GetUser() { / ...

  9. 《笨办法学 Python(第四版)》高清PDF|百度网盘免费下载|Python编程

    <笨办法学 Python(第四版)>高清PDF|百度网盘免费下载|Python编程 提取码:jcl8 笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机 ...

  10. Fortify Audit Workbench 笔记索引

    Password Management: Password in Configuration File(明文存储密码) https://www.cnblogs.com/mahongbiao/p/124 ...