dポイントプレゼントキャンペーン実施中!

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で見てください。

A 回答 (3件)

No2のものです


こんちは

$postage2 には $postageの値をカンマ区切り表記した文字列が格納されます。たとえば$postageの内容が1234だった場合には
$postage2には 1,234 という文字列が代入されます

1,234という文字列を数値として扱おうとすると、,より左の部分の1しか認識しません。
本来なら
3*1234 = 3702となるべきところが
3*"1,234" → 3*1 = 3となったのではないかと思われます
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/12/13 14:43

こんちは



(3)$postageallnum=$floor*$postage2;

(3)$postageallnum=$floor*$postage;
に変更してみてはどうでしょうか
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/12/12 18:22

申し訳ないけど、わざわざリンク先に行ってダウンロードして…


という手間はかけたくありませんので実際のソースがどうなのかはわかりませんが、

> (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 を組み合わせて使ってないとかいろいろあるので
ちょっとした変数名の打ち間違いも見つけにくいです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/12/12 18:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!