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. 【高性能Mysql 】读书笔记(二)

    第4章 Schema 与数据类型优化 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 选择优化的数据类型 选择合适数据类型的三个原则 更小的通常更好 - 速度更快 ...

  2. Ethical Hacking - Web Penetration Testing(6)

    REMOTE FILE INCLUSION Similar to local file inclusion. But allows an attacker to read ANY file from ...

  3. C# 泛型中的数据类型判定与转换

    提到类型转换,首先要明确C#中的数据类型,主要分为值类型和引用类型: 1.常用的值类型有:(struct) 整型家族:int,byte,char,short,long等等一系列 浮点家族:float, ...

  4. Mobilenet V1

    目录 1. Depth Separable Convolution 2. 网络结构 3. 宽度因子和分辨率因子 4. 代码实现 参考博客: https://cuijiahua.com/blog/201 ...

  5. Python面试题!百度大牛总结十条Python面试题陷阱

    无论是应聘Python web开发,爬虫工程师,或是数据分析,还是自动化运维,都涉及到一些基础的知识!我挑了一些Python的基础面试题,看看你能不能的答上来,也许面试的同学用的着! 问题1:请问如何 ...

  6. 使用SQL语句进行数据复制

    使用SQL语句对数据或者表进行复制,一般用于两张表结构相同的时候使用. SQL Server中,如果目标表存在: insert into 目标表 select * from 原表; SQL Serve ...

  7. 服务端socket重用属性设置

    初始化socket socket是一种系统资源,并不是每次初始化都一定成功,因此为了避免初始化失败,一般使用多次初始化的方式,如下所示: unsigned int times = 0x0; while ...

  8. VS code 的集成终端Integrated terminal 的颜色问题

    其实是默认终端的配色问题在使用vs code时,运行代码时,控制台是这样子的,搞得我很难受 一块一块的 其实是默认终端的配色问题 默认终端一般是powershell,还可以是cmd,或者git bas ...

  9. AndroidStudio查找硬编码的String字符串

    在Menu的“Analyze”中,选择“Run Inspection By Name”,然后输入“Hardcoded strings”,执行后,可以找到所有没有加入strings.xml的字符串. 按 ...

  10. 全栈的自我修养: 0005 Java 包扫描实现和应用(Jar篇)

    全栈的自我修养: 0005 Java 包扫描实现和应用(Jar篇) It's not the altitude, it's the attitude. 决定一切的不是高度而是态度. Table of ...