比较PHP中的字符串 - 问题

时间:2009-12-26 13:08:36

标签: php string strcmp

我想允许用户输入优惠券号码以获得折扣。输入并提交优惠券号码后,页面会重新加载,并显示已输入正确金额的勾号。

如果优惠券数量£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

7 个答案:

答案 0 :(得分:6)

你应该真的存储/使用折扣值作为数字,这将使比较更容易。

答案 1 :(得分:1)

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

与以下相比,似乎非常难以理解:

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

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

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

将来你会发现在对coupon_amount()的返回值进行任何算术运算之前,你必须首先删除井号。

答案 2 :(得分:1)

有很多事情对用户来说似乎微不足道,但可能会破坏字符串比较

  • coupon_amount()可能会在返回值的某处插入一些空格
  • coupon_amount()可能会返回可变数量的零
  • coupon_amount()可以使用逗号代替点(取决于区域设置)
  • coupon_amount()可以使用某些HTML实体
  • 对井号进行编码

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

答案 3 :(得分: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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我不得不去做这个工作的荒谬长度:) ..我改变了第一个if if statment:

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

答案 6 :(得分:0)

你试过比较它没有英镑符号吗? 像这样

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

我发现你在检索英镑符号时遇到问题所以我认为最好这样做。