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 }  ?>

我在比较方面做错了吗?

我在下面遵循了 Oscar 的建议,这是输出。似乎是编码问题。并且对于 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

你试过打印出所有的值吗?

<?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>

修正
所以是的,现在我们可以看到这个输出,看起来政变字符串是一个 UTF16(10 个字节长),另一个是别的东西(5 个字节长)。

(接着讲道。)在处理金钱时,你真的应该格外小心,以确保正确处理数字。我们刚刚看到字符串会受到编码的影响,并且就像其他人指出的那样,浮点数会受到小数误差的影响。您最好的选择可能是尝试使用整数以 1/100 表示,并在单独的变量中表示货币。(传道。)

但我猜coupon_amount- 函数无处不在,你不能改变它。然后你可能想考虑转换这两个字符串,以便它们的格式相同。看看iconv

于 2009-12-26T16:55:50.860 回答
1
<?php if(strcmp($coup_amount, $zero_amount)== 0) { ?>

与以下相比,似乎非常不可读:

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

如果 coupon_amount() 返回的是实际值,而不是格式化的字符串表示形式。

您是否可以更改 coupon_amount() 函数以摆脱英镑符号?php函数money_format非常适合将用户货币符号添加到字符串中以显示在页面上(或者您将语言环境设置为哪个符号)

将来您会发现自己必须先删除英镑符号,然后再对 coupon_amount() 的返回值进行任何算术运算

于 2009-12-26T13:32:00.677 回答
1

有很多东西对用户来说似乎无关紧要,但可能会破坏字符串比较

  • coupon_amount() 可能会在返回值的某处插入一些空格
  • coupon_amount() 可能返回可变数量的零
  • coupon_amount() 可以使用逗号而不是点(取决于语言环境)
  • coupon_amount() 可以使用一些 HTML 实体对英镑符号进行编码

也就是说,比较数值,然后将数字格式化为货币要好得多。

于 2009-12-26T14:42:13.140 回答
0

The absurd lengths I had to go to to get this working :) .. I changed the first if statment to:

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

strcmp 调用似乎没问题,我赌的是 coupon_amount 函数。

于 2009-12-26T13:12:25.280 回答
0

你有没有尝试在没有井号的情况下比较它?..像这样

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

我看到你在检索英镑符号时遇到问题,所以我认为最好试试这个。

于 2013-08-07T06:13:26.973 回答