0

割引を受けるために、ユーザーがクーポン番号を入力できるようにしたい。クーポン番号を入力して送信すると、ページがリロードされ、正しい金額が入力されたことを示すチェックマークが表示されます。

私がこれを行おうとしている方法は、クーポンの金額が0.00ポンドでない場合にティックを表示することです。しかし、文字列の比較は、常に£0.00ではないと考えているため、機能していないようです。コードは次のとおりです。関数coupon_amount()は、クーポンの金額を返します。Coupon_amount()は「£0.00」(ポンド記号を含む)を返します

<?php $coup_amount = coupon_amount(); ?>
<?php $zero_amount = "£0.00"; ?>

<?php if(strcmp($coup_amount, $zero_amount)== 0) { ?>

 <?php echo 'Enter coupon code if applicable:' ?>
 <input type='text' class='couponinput' name='coupon_num' id='coupon_num' value='coupons_name' />
 <input type='submit' class='update-button' value='submitcoupon' />

<?php } else {  ?>

 <?php echo 'Thanks.' ?><input type='text' disabled='disabled' class='couponinput' name='coupon_num' id='coupon_num' value='coupons_name' />
 <div class='tick'></div>

<?php }  ?>

私は比較で何か間違ったことをしていますか?

私は以下のオスカーの提案に従いました、そしてここに出力があります。エンコーディングの問題のようです。また、zero_amountのポンド記号が正しく表示されていません。

coup_amount: (£0.00)  zero_amount: (�0.00) 
coup_len:10 zero_len:5
strcmp: -1
coup_ascii: 38 zero_ascii:163
4

7 に答える 7

6

割引値を数値として保存/操作する必要があります。これにより、比較がはるかに簡単になります。

于 2009-12-26T13:29:48.093 に答える
1

ユーザーにとっては取るに足らないように見えるものがたくさんありますが、文字列の比較を壊す可能性があります

  • Coupon_amount()は、戻り値のどこかにいくつかのスペースを挿入する場合があります
  • Coupon_amount()は可変数のゼロを返す場合があります
  • Coupon_amount()はドットの代わりにコンマを使用する場合があります(ロケールによって異なります)
  • Coupon_amount()は、HTMLエンティティを使用してポンド記号をエンコードする場合があります

とはいえ、数値を比較してから、数値を通貨としてフォーマットする方がはるかに優れています。

于 2009-12-26T14:42:13.140 に答える
1
<?php if(strcmp($coup_amount, $zero_amount)== 0) { ?>

以下と比較して非常に読めないようです:

<?php if(coupon_amount() == 0) { ?>

クーポン_amount()が、フォーマットされた文字列表現ではなく、実際の値を返した場合。

ポンド記号を取り除くためにcoupon_amount()関数を変更できますか?php関数money_formatは、ページに表示する文字列(またはロケールを設定した記号)にユーザーの通貨記号を追加するのに適しています。

将来的には、coupon_amount()からの戻り値を計算する前に、まずポンド記号を削除する必要があります。

于 2009-12-26T13:32:00.677 に答える
1

すべての値を印刷してみましたか?

<?php $coup_amount = coupon_amount(); ?>
<?php $zero_amount = "£0.00"; ?>

//print'em out
<pre>
<?php 
  echo "coup_amount: ($coup_amount)  zero_amount: ($zero_amount) \n";
  echo "coup_len:".strlen($coup_amount)." zero_len:".strlen($zero_amount)."\n";
  echo "strcmp: ".strcmp($coup_amount, $zero_amount)."\n";
  echo "coup_ascii: ".ord($coup_amount[0])." zero_ascii:".ord($zero_amount[0]);
?>
</pre>

修正
そうです、これからの出力を確認できるようになったので、coup-stringはUTF16(10バイト長)であり、もう1つは別のもの(5バイト長)のようです。

(説教は続きます。)お金を扱うとき、あなたは本当に数字が正しく扱われることを確実にするために特別な注意を払うべきです。文字列はエンコードの対象であり、他の人が指摘しているように、floatは小数のエラーの対象であることがわかりました。おそらく最善の策は、整数を使用して1/100で表現し、通貨を別の変数で表現することです。(説教します。)

しかし、coupon_amount-functionはどこでも使用されており、変更することはできないと思います。次に、2つの文字列を同じ形式になるように変換することを検討します。iconvを見てください。

于 2009-12-26T16:55:50.860 に答える
0

strcmpの呼び出しは問題ないようです。私の賭けはcoupon_amount関数です。

于 2009-12-26T13:12:25.280 に答える
0

これを機能させるために私が行かなければならなかったばかげた長さ:)..私は最初のifステートメントを次のように変更しました:

if((ord($coup_amount[0])==38) && (ord($coup_amount[1])==35) 
&& (ord($coup_amount[2])==49) && (ord($coup_amount[3])==54) 
&& (ord($coup_amount[4])==51) && (ord($coup_amount[5])==59) 
&& (ord($coup_amount[6])==48) && (ord($coup_amount[7])==46) 
&& (ord($coup_amount[8])==48) && (ord($coup_amount[9])==48) 
&& (ord($coup_amount[10])==0)) 
于 2009-12-27T13:27:22.260 に答える
0

ポンド記号なしで比較することはできますか?..このように

substr($coup_amount, 1) == "0.00";

ポンド記号を取得するときに問題が発生しているようですので、これを試すのが最善だと思います。

于 2013-08-07T06:13:26.973 に答える