2016-07-29 6 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(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 파운드 r 년이면 3 가지 소득 세율이 적용됩니다.

+1

왜 noTaxThreshold 변수를 구문 분석해야합니까? 십진법이 아닌가? – LarsTech

+1

그냥 단순한 if-then-else .... –

+0

다른 SQL 테이블에서 세금 정보를 가져 오기 위해 SqlCommand를 수행 한 다음 변수에 값을 저장했지만 문자열을 사용하지 않는 한 그 값을 저장하지 못했습니다. 구문 분석. 임계 값은 현재 £ 11,000.00이므로 십진수는 돈보다 더 좋을 것입니다. –

답변

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

일정 금액 이상의 일정한 세율을 원한 것처럼 들립니다. 그렇다면하면 다음이 그것을 수행해야합니다 당신이 밴드에서 과세받을 일반적으로 통해

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; 
    } 

을, 그래서 당신이 부분 만에 45 %의 세금을 납부 당신은 내가 int를 사용 150K

이상 이었다 벌었 당신은 당신이 쉽게 거꾸로 작동하고 당신은 이미에 대한 세금을 계산 한 금액을 할인을 찾을 수 있습니다

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