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

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

C#开发笔记概述

文章目录

概述

首先,要对个人所得税的计算方式了解之后再看本文。

个人所得税的计算使用任何计算机语言来实现都比较简单,关键是如何优雅的实现呢?我们的目标是消除大量难看的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 (var 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();
}

以上是调用方的代码,通过扩展方法使得代码非常精简,易于理解。以下是这个案例的输出结果: 

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

本文由 .Net中文网 原创发布,欢迎大家踊跃转载。

转载请注明本文地址:https://www.byteflying.com/archives/960

发表评论

登录后才能评论