• ベストアンサー

カートの送料設定を2個まで1個口の送料にするには。

2個で1個口の発送ができる商品を売っています。1個または2個は1個口の送料で。3個または4個の場合は2個口。5個または6個の場合は3個口・・・・ このような送料の設定ができるように、KENTさんのショッピングカート→​http://www.kent-web.com/cart/mart.html​ を変更したいのですが、 求め方は、商品の総数を求めて1を足しそれを2で割り切り捨て(2で割って切り上げをするやり方がよくわからなかったので、このようにしました)し、それに都道府県別送料をかければいいのかなと思っています。 $numは各商品の数量 $postage2は都道府県別送料だと思います。 それを前提にmart_init.cgiを以下のような修正をしました。 foreachの{}内に(1)を入れ商品の総数を出し、送料表示の前らへんで(2)(3)を付け足しました。送料表示部分を$postage2から$postageallnumに変更。 (1)$allnum+=$num; (2)$floor=int(($allnum+1)/2); (3)$postageallnum=$floor*$postage2; しかし、$postageallnumの値が$floorの値と同じになります。 なぜそうなるのでしょうか?perl初心者なので簡単なミスをしてると思うですが。 なお、元のソースはここに載せると著作権違反になると思うので載せることができませんお手数ですが上記URLで見てください。

質問者が選んだベストアンサー

  • ベストアンサー
  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.3

No2のものです こんちは $postage2 には $postageの値をカンマ区切り表記した文字列が格納されます。たとえば$postageの内容が1234だった場合には $postage2には 1,234 という文字列が代入されます 1,234という文字列を数値として扱おうとすると、,より左の部分の1しか認識しません。 本来なら 3*1234 = 3702となるべきところが 3*"1,234" → 3*1 = 3となったのではないかと思われます

noname#52471
質問者

お礼

回答ありがとうございます。 なるほどそういうことだったのですね。 No2でお答え頂いた回答で動作自体は問題なく解決したのですが、 なぜ$postage2では思った数値が得られないかが疑問のままでした。 $postageに金額表記のためにコンマを入れた文字列が$postage2ということで言われてみれば納得です。 今回お答え頂いた回答で謎が解けました。 非常に助かりました。ありがとうございます。

その他の回答 (2)

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.2

こんちは (3)$postageallnum=$floor*$postage2; ↓ (3)$postageallnum=$floor*$postage; に変更してみてはどうでしょうか

noname#52471
質問者

お礼

ありがとうございましす。 $postage2;を$postage;にしたら希望通りの動作をしました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

申し訳ないけど、わざわざリンク先に行ってダウンロードして… という手間はかけたくありませんので実際のソースがどうなのかはわかりませんが、 > (1)$allnum+=$num; > (2)$floor=int(($allnum+1)/2); > (3)$postageallnum=$floor*$postage2; > > しかし、$postageallnumの値が$floorの値と同じになります。 $postageallnum と $floor が同じ値になるというのなら、この式の場合 $postage2 が 1か0になっているとしか思えないのですがその辺はどうなんですか? ロジックを確かめるために小さいスクリプトを組んでみると use strict; use warnings; my $postage2 = 450; foreach my $allnum (1..10) { my $floor = int(($allnum+1)/2); my $postageallnum = $floor*$postage2; printf "\$allnum=%3d, \$floor=%3d, \$postageallnum=%5d\n", $allnum, $floor, $postageallnum; } $allnum= 1, $floor= 1, $postageallnum= 450 $allnum= 2, $floor= 1, $postageallnum= 450 $allnum= 3, $floor= 2, $postageallnum= 900 $allnum= 4, $floor= 2, $postageallnum= 900 $allnum= 5, $floor= 3, $postageallnum= 1350 $allnum= 6, $floor= 3, $postageallnum= 1350 $allnum= 7, $floor= 4, $postageallnum= 1800 $allnum= 8, $floor= 4, $postageallnum= 1800 $allnum= 9, $floor= 5, $postageallnum= 2250 $allnum= 10, $floor= 5, $postageallnum= 2250 ちゃんと動いているっぽいですが。 悪口になりかねないのであまり大きな声では言えませんがKENT氏の 発表しているスクリプトの多くはPerl 4でも動作できるようにしているために my を使った宣言と use strict を組み合わせて使ってないとかいろいろあるので ちょっとした変数名の打ち間違いも見つけにくいです。

noname#52471
質問者

お礼

ありがとうございましす。 $postage2;を$postage;にしたら希望通りの動作をしました。

関連するQ&A

専門家に質問してみよう