2016-07-29 8 views
-1

私は£11,000と£43,000の間で税を計算するためにC#の所得税の計算

£11,000 - £43,000 20% 
£43,001 - £150,000 40% 
150,000+   45% 

間ので所得税の異なるレート

20% 
40% 
45% 

のための3つのテキストボックスを持っている私は、ifを書かれています明細書

if(Salary > decimal.Parse(noTaxThreshold) && Salary <= decimal.Parse(pc20TaxLimit)) 
      { 
       taxableIncome = Salary - decimal.Parse(noTaxThreshold); 
       annualTax = taxableIncome * decimal.Parse(lowerTaxPc); 
       tbATax.Text = annualTax.ToString(); 
      } 
      else 
      { 
       tbANetPay.Text = tbAGrossPay.Text; 
       tbATax.Text = "0.00"; 
      } 

たとえば、支払い額が200,000ポンドだった場合、他の金額を計算するにはどうすればよいですかこの場合、3種類の所得税率が適用されます。

+1

なぜあなたはnoTaxThreshold変数を解析する必要がありますか?それは小数ではありませんか? – LarsTech

+1

単純なif-then-else .... –

+0

私はSqlCommandを使って別のSQLテーブルから税情報を取得し、その値を変数に格納しましたが、文字列を使用しないとその値を格納できませんでした。解析する。限界値は現在11,000ポンドであるので、私は小数点が2倍よりもお金のほうが良いと思った。 –

答えて

0

すでに税金を計算した金額を逆算して割引する方が簡単かもしれません。どのように:

public decimal CalculateTax(decimal salary) { 
    const int topRateThreshold = 150000; 
    const int higherRateThreshold = 43000; 
    const int basicRateThreshold = 11000; 

    const decimal topRateFactor = 0.45M; 
    const decimal higherRateFactor = 0.40M; 
    const decimal basicRateFactor = 0.20M; 

    decimal salaryWorkingRange = salary; 

    decimal taxDue = 0; 

    if (salaryWorkingRange > topRateThreshold) { 
     taxDue += (salaryWorkingRange - topRateThreshold) * topRateFactor; 
     salaryWorkingRange = topRateThreshold; 
    } 
    if (salaryWorkingRange > higherRateThreshold) { 
     taxDue += (salaryWorkingRange - higherRateThreshold) * higherRateFactor; 
     salaryWorkingRange = higherRateThreshold; 
    } 
    if (salaryWorkingRange > basicRateThreshold) { 
     taxDue += (salaryWorkingRange - basicRateThreshold) * basicRateFactor; 
    } 

    return taxDue; 
} 
0

一定額以上の一定の税率を希望しているようです。もしそうなら、これはそれを行う必要があります:あなたが唯一の部分に45%の税を支払うので、あなたは、バンドで課税を受ける通常を通じて

private decimal CalculateTax(int salary) 
    { 
     int noTaxThreshold = 11000; 
     int band1 = 10999; 
     int band2 = 43000; 
     int band3 = 150000; 

     if (salary < noTaxThreshold) return 0; 
     if (salary >= band3) return (salary - noTaxThreshold) * (decimal)0.45; 
     if (salary > band2) return (salary - noTaxThreshold) * (decimal)0.40; 
     if (salary > band1) return (salary - noTaxThreshold) * (decimal)0.20; 
     return 0; 
    } 

を、あなたは私がint型を使用

150kのの上にそれは たearnt 通常はとなります。必要な場合は小数点以下を変更することができます

0

私は実際にもう少しダイナミックに近づいた。

public class TaxBracket 
{ 
    public int Low { get; set; } 
    public int High { get; set; } 
    public decimal Rate { get; set; } 
} 

public class TaxCalculator 
{ 
    private readonly int _taxableIncome; 
    private readonly TaxBracket[] _taxBrackets; 

    public TaxCalculator(int taxableIncome, TaxBracket[] taxBrackets) 
    { 
     _taxableIncome = taxableIncome; 
     _taxBrackets = taxBrackets; 
    } 

    public decimal Calculate() 
    { 
     var fullPayTax = 
      _taxBrackets.Where(t => t.High < _taxableIncome) 
       .Select(t => t) 
       .ToArray() 
       .Sum(taxBracket => (taxBracket.High - taxBracket.Low)*taxBracket.Rate); 

     var partialTax = 
      _taxBrackets.Where(t => t.Low <= _taxableIncome && t.High >= _taxableIncome) 
       .Select(t => (_taxableIncome - t.Low)*t.Rate) 
       .Single(); 

     return fullPayTax + partialTax; 
    } 
} 

大括弧で囲んでいるので、変更が簡単です。

0

ifの読み込みにコードを混乱させないでください。新しい税金バンドが作成されるとどうなりますか?代わりにこの方法をお試しください:

var taxBands = new[] 
{ 
    new { Lower = 0m, Upper = 10999m, Rate = 0.0m }, 
    new { Lower = 11000m, Upper = 43000m, Rate = 0.2m }, 
    new { Lower = 43001m, Upper = 150000m, Rate = 0.4m }, 
    new { Lower = 150001m, Upper = decimal.MaxValue, Rate = 0.45m } 
}; 

var salary = 200000m; // however you get the salary figure 

var taxToBePaid = 0m; 

foreach (var band in taxBands) 
{ 
    if(salary > band.Lower) 
    { 
     var taxableAtThisRate = Math.Min(band.Upper - band.Lower, salary - band.Lower); 
     var taxThisBand = taxableAtThisRate * band.Rate; 
     taxToBePaid += taxThisBand; 
    } 
} 

Console.WriteLine(taxToBePaid); // or do whatever you want here