2017-07-21 11 views
-3

私は階層型税金計算を作成しようとしています。簡潔なスニペットで階層税率を決定する方法は?

は、ユーザーは、次のように私は、税が充電され、次の階層を持って、その量から500,000

言う金額を入力:

 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% 

それでは最初125,000上ノー税、2%次に124,999のようになります。

長すぎるコード行で長時間の計算を思いつくことができます。私はこれを行うための比較的簡単な方法があると確信していますので、私はより簡潔な方法を見つけるためにここで人々の大きな知識に弓矢です。

+0

を私は興味私はもっ​​と簡潔な何かを考え出すことができるかどうかを見るために、それを比較する何かを持っている必要があります! –

+0

ユーザーが130,000を入力したときに期待される結果は何ですか?私は '125,000 * 0.00 +(130,000 - 125,000)* .02 = 100'を期待しています。 – Arjan

答えて

1

うん、いい挑戦だけど。申し訳ありませんが、私は本当にスマートな方法を考え出すことができませんでしたが、あなたが非常に必要な場合、私はこの小さな機能を作りました。

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; 

} 

あなただけの値(intまたはダブル)でそれを養う、それが計算した値を返します。あなたは,(カンマ)を使用することはできません。

編集:ロジックが少し変更されました。

1

これは番号の検証や通貨の書式設定を行いませんが、スニペットをかなり圧縮します。私はあなたが結果として欲しい人物もわからないので、私は3つの値を返しています:レート、税額、価格から税金を差し引いた金額。

if/else文のブロックではなく、配列関数を使用することにしました。 (Demo

方法#1:2ライン及びリターン

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

方法#2:4ライン及びリターンが、より効率的

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

このような関数を呼び出します:var_export(tax(126999));意志出力:

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

「コードの簡潔性」を「コードの効率性」よりも先に置くので、方法1をお勧めします。このタスクは非常に小さい/軽いので、私は誰もマイクロ最適化を介してどのような利益に気づくとは思わない。

P.S.あなたは同じスクリプトでこの複数回行っていないおよび/または関数呼び出しをしたくない場合、あなたはこれを使用して$rateを宣言することができます。

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

または

$tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0]; 
foreach($tiers as $rate=>$threshold){ 
    if($value>$threshold){break;} 
} 
関連する問題