2017-07-21 3 views
-3

Ich versuche, einen abgestuften Steuerrechner zu erstellen.Wie gestaffelten Steuersatz mit einem kurzen Snippet zu bestimmen?

Der Benutzer gibt eine Menge, sagen 500,000

Von diesem Betrag habe ich dann die folgenden Stufen haben, die Steuer berechnet sich wie folgt:

 0 - 125,000 = 0% 
    125,001 - 250,000 = 2% 
    250,001 - 925,000 = 5% 
    925,001 - 1,500,000 = 10% 
1,500,001 - or more = 12% 

Also keine Steuer auf den ersten 125,000, dann 2% auf dem nächsten 124,999 und so weiter.

Ich kann mit langatmigen Berechnungen mit viel zu vielen Zeilen Code kommen. Ich bin mir sicher, dass es eine relativ einfache Möglichkeit gibt, dies zu tun, also verneige ich mich vor dem größeren Wissen der Leute hier, um eine prägnantere Methode zu finden.

+0

Ich bin interessiert um zu sehen, ob ich mir etwas Konkreteres ausdenken kann, aber ich muss etwas haben, um es zu vergleichen! –

+0

Was ist das erwartete Ergebnis, wenn der Benutzer 130.000 eingibt? Ich würde erwarten, 125.000 * 0.00 + (130.000 - 125.000) * .02 = 100'. – Arjan

Antwort

1

Hm, nette Herausforderung obwohl. Es tut mir leid, ich konnte nicht wirklich auf eine kluge Art und Weise aufkommen, aber wenn du in Not bist, habe ich diese kleine Funktion geschaffen;

function calculator($value) { 

    if(!is_int($value) && !is_double($value)) 
     return; 

    if($value > 1500000) 
     $value = $value - ($value*0.12); 

    elseif($value > 925000) 
     $value = $value - ($value*0.10); 

    elseif($value > 250000) 
     $value = $value - ($value*0.05); 

    elseif($value > 125000) 
     $value = $value - ($value*0.02); 

    return $value; 

} 

Sie füttern sie nur mit einem Wert (int oder double), und es wird der berechnete Wert zurück. Beachten Sie, dass Sie , (Komma) nicht verwenden können.

Edit: Auf ein wenig Logik geändert.

1

Dies wird keine Zahlenüberprüfung oder Währungsformatierung machen, aber das Snippet wird ziemlich gut verdichtet. Ich bin mir auch nicht sicher, welche Zahl Sie haben wollten, deshalb gebe ich drei Werte zurück: den Satz, den Betrag der Steuer und den Preis abzüglich der Steuer.

Anstatt ein Block von if/else-Anweisungen, habe ich gewählt, Array-Funktionen zu verwenden. (Demo)

Methode 1: 2-Linien und eine Rückkehr

function tax($value) { 
    $tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0]; 
    $rate=key(array_filter($tiers,function($threshold)use($value){return $value>$threshold;})); 
    return [$rate,$value*$rate,$value-$value*$rate]; 
} 

Methode # 2: 4-Linien und eine Rückkehr, aber effizientere

function tax($value) { 
    $tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0]; 
    foreach($tiers as $rate=>$threshold){ 
     if($value>$threshold){break;} // $rate will be preserved outside of the loop 
    } 
    return [$rate,$value*$rate,$value-$value*$rate]; 
} 

Aufruf der Funktion wie folgt : var_export(tax(126999)); AUSGABE:

array (
    0 => '.12', 
    1 => 1523988.0, 
    2 => 11175912.0, 
) 

Da Sie "Code Kürze" vor "Code Effizienz" setzen, würde ich Methode # 1 empfehlen. Da diese Aufgabe so klein und leicht ist, glaube ich nicht, dass irgendjemand irgendwelche Vorteile durch Mikrooptimierung bemerken wird.

p.s. Wenn Sie nicht tun, sind diese mehrmals im selben Skript und/oder keine Funktionsaufruf möchten, können Sie $rate erklären nur durch diese Verwendung:

$tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0]; 
$rate=key(array_filter($tiers,function($threshold)use($value){return $value>$threshold;})); 

oder

$tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0]; 
foreach($tiers as $rate=>$threshold){ 
    if($value>$threshold){break;} 
} 
Verwandte Themen