- ベストアンサー
消費税の計算で 税込価格から税抜き価格を自動計算させたい
今回は、perlにて入力画面より税込価格を入力し、自動計算させて税抜き価格を表示させたい ということです。 しかし、今の記述方法ではきちんと計算されません。どういう記述をしたら良いのか?ご教授願います。 現在の記述は以下のようになっています。komipriceは、税込価格、nukipriceは税抜き価格です $VD[$REC{Data}{nukiprice}]=sprintf("%.f",$VD[$REC{Data}{komiprice}]/1.05*1000000); $VD[$REC{Data}{nukiprice}]=~s/(.*\d)(\d\d\d)(\d\d\d)/$1,$2/;
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
以下のようにしてください。 1.入力値がカンマ区切りなのでカンマをとる。 2.消費税抜きの価格にする。 3.結果を3桁で区切る。 ------------------------ $in = $VD[$REC{Data}{komiprice}]; #カンマをとる $in =~ s/,//g; #消費税抜きの価格にする $out=int($in/1.05); #3桁で区切る $out2 = sprintf("%d",$out); $ll = length($out2); for ($i =0 ; $i < $ll; $i++){ if ($i%3 == 0 && $i != 0){ substr($out,$ll-$i,0) = ","; } } #結果を格納する $VD[$REC{Data}{nukiprice}]=$out2; -----------------------------------
その他の回答 (2)
- tatsu99
- ベストアンサー率52% (391/751)
前回の回答の -------------------- #3桁で区切る $out2 = sprintf("%d",$out); $ll = length($out2); for ($i =0 ; $i < $ll; $i++){ if ($i%3 == 0 && $i != 0){ substr($out,$ll-$i,0) = ","; } } #結果を格納する $VD[$REC{Data}{nukiprice}]=$out2; -------------------------------- が3桁毎にカンマで区切るところです。 $out2に3桁毎に区切った結果がはいっています。 出力結果が何桁でも対応しているはずですが、 期待した結果が得られませんでしょうか? 尚、 (1)$VD[$REC{Data}{nukiprice}]=~s/(.*\d)(\d\d\d)/$1,$2/; (2)$VD[$REC{Data}{nukiprice}]=~s/(.*\d)(\d\d\d)(\d\d\d)/$1,$2,$3/; の処理は必要ありません。
補足
while($VD[$REC{Data}{$_}]=~s/^([+-]?\d+)(\d{3})/$1,$2/g){} } }else{ @VU=@vtmp } という一文がこの処理の前にあるのですがこれは関係ないのでしょうか? (1)$VD[$REC{Data}{nukiprice}]=~s/(.*\d)(\d\d\d)/$1,$2/; (2)$VD[$REC{Data}{nukiprice}]=~s/(.*\d)(\d\d\d)(\d\d\d)/$1,$2,$3/; ちなみにこの一文がなければ、カンマ区切りされませんでした。
- osamuy
- ベストアンサー率42% (1231/2878)
> きちんと計算されません。 何がどう「きちんと」していないかを、ちゃんと説明しないと適切な回答がつかないと思います。 小数点が出てしまうのが問題だとしたら、以下のようにするとか。 $price -= int( $price * 5 / 105 );
補足
きちんと計算されないというのは、 一例を挙げると、19,950円(税込)だとすると 本来であれば、税抜き価格は19,000円となるはずが 19,024円と表示されてしまいます。 24円の部分が余計なのです。 しかも42,000円の場合だときちんと税抜き40,000円と表示されます。 この1件以外は、すべての数字において端数が表示されてしまいます。
お礼
実際に100万単位になるとカンマ表示がされません。 計算は問題なくされていますが、なにが原因なのでしょうか?
補足
さっそくのご回答ありがとうございます。 百の位も問題なく計算され、今まで遠回りしてたのがうそみたいです。 ほんとうに助かりました。 あと、表示の際に3桁区切りで、カンマを入れて見やすくしたいのですが どのような記述をすればよろしいのでしょうか? 現在、(1)の場合は、十万の位まで (2)は百万の位の時でしかカンマが出なかったりします。 (1)$VD[$REC{Data}{nukiprice}]=~s/(.*\d)(\d\d\d)/$1,$2/; (2)$VD[$REC{Data}{nukiprice}]=~s/(.*\d)(\d\d\d)(\d\d\d)/$1,$2,$3/; たぶん、if文で6桁の時は(1) 7桁以上なら(2)という記述が必要なんだと思いますが 実際にどういった記述があればよいのか? お手数ですがご教授頂ければと思います。