PHP sıkıntılardan - dize karşılaştırma

7 Cevap php

Ben kullanıcı bir indirim almak için bir kupon numarası girmek için izin istiyor. Kupon numarası girilir ve gönderildikten sonra, sayfayı yeniden onlar doğru bir miktar girmiş olduğunu gösteren bir kene withe.

Kupon ödeme tutarı not £ 0,00 ise bunu yapmaya çalışıyorum yolu kene görüntülüyor. Ancak dize karşılaştırma her zaman buna 0,00 £ olmadığını düşünüyor yana, iş görünmüyor. Aşağıdaki gibi kodudur. Fonksiyonu coupon_amount () kupon miktarını döndürür. (diyez işareti dahil) coupon_amount () döner "£ 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 }  ?>

Ben karşılaştırma ile yanlış bir şey yapıyorum?

Ben aşağıda Oscar'ın öneriyi takip ve burada çıktı. Bir kodlama sorun gibi görünüyor. Ve diyez işareti zero_amount düzgün görünmüyor.

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

7 Cevap

Eğer tüm değerlerini baskı denediniz mi?

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

Amendment
So yes, now that we can see the output from this, it seems like the coup-string is an UTF16 (10 bytes long) and the other is something else (5 bytes long).

(Vaaz izler.) Para ile uğraşırken gerçekten emin rakamlar doğru işlenir yapmak için ekstra dikkat etmelisiniz. Biz sadece dizeleri kodlama tabi olduğunu gördüm, ve diğerleri işaret gibi, mantarlar fraksiyonel hataları tabidir. Yapabileceğiniz en iyi şey denemek ve bir tamsayı kullanarak 1/100s bunu ifade ve ayrı bir değişken olarak para ifade etmek için muhtemelen. (Üzerinde Vaaz.)

Ama ben coupon_amount-fonksiyonu her yerde kullanılır ve bunu değiştirmek mümkün değil tahmin ediyorum. Aynı formatta böylece Sonra istediğin iki dizeleri dönüştürme içine bakmak olabilir. iconv bir göz atın.

Eğer gerçekten sayı olarak indirim değerleri ile çalışma / depolama gerektiğini, bu karşılaştırma çok daha kolay olacaktır.

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

Kıyasla çok okunmaz görünüyor:

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

Coupon_amount () gerçek değeri değil, biçimlendirilmiş dize temsil döndürdü.

Eğer sterlin simgesi kurtulmak için coupon_amount () işlevi değiştirmek yapabiliyor musunuz? php function money_format kullanıcıların para birimi simgesi sayfada görüntüleme (ya da şimdiye kadar hangi sembol için yerel ayarı) için bir dize ne olursa olsun eklemek için iyidir

Gelecekte size coupon_amount gelen dönüş değeri üzerinde herhangi bir aritmetik yapmak () önce kendinizi ilk kiloluk sembolü kaldırmak zorunda bulacaksınız

Orada kullanıcı için önemsiz gibi görünen şeylerin bir yeri vardır, ama string karşılaştırma kırılabilir

  • coupon_amount () yerde döndürülen değer bazı boşluklar ekleyebilirsiniz
  • coupon_amount () sıfırları değişken sayıda döndürebilir
  • coupon_amount () (yerele bağlı) yerine noktanın virgül kullanabilirsiniz
  • coupon_amount () bazı HTML varlık kullanarak diyez işareti kodlamak olabilir

Bu sayısal değerleri karşılaştırmak için çok daha iyi olduğunu ve daha sonra para birimi olarak format numarası, söyledi.

Strcmp çağrı benim bahis coupon_amount fonksiyonu üzerinde, ok gibi görünüyor.

Için statment eğer bu çalışma almak için ben gitmek zorunda saçma uzunlukları :) .. ben ilk değişti:

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

have you triend comparing it without a pound sign?.. like this

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

i bu denemek için iyi olduğunu düşünüyorum yani diyez işareti alınırken Eğer sorun yaşıyorsanız, bkz.