C#开发笔记之04-如何用C#优雅的计算个人所得税?

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语句的机制,并且使用更加优雅的方式来计算税额。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值