我想允许用户输入优惠券号码以获得折扣。输入并提交优惠券号码后,页面会重新加载,并显示已输入正确金额的勾号。
如果优惠券数量不£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
答案 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)
有很多事情对用户来说似乎微不足道,但可能会破坏字符串比较
说,比较数值,然后将数字格式化为货币要好得多。
答案 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";
我发现你在检索英镑符号时遇到问题所以我认为最好这样做。