2014-06-23 3 views
1

Я хочу умножить значение на другое значение из xml-файла, оно работает, но не так, как я хочу. Если $amount равен 5, когда я умножаюсь с $eurotodollar, я все равно получаю 5 не 6.882. Есть ли что-то мне не хватает здесь ...Как извлечь значения из файла xml и выполнить математические операции?

У меня есть php код:

<?php 
    $xml = simplexml_load_file('curr.xml')or die("Error: Cannot create object"); 

    $eurtodollar = $xml->OrigCurrency->Cube->Rate[0]; 

    if(isset($_POST['submit'])) 
     { 
     $amount = $_POST['amount']; 
     $cur1 = $_POST['cur1']; 
     if(!isset($_POST['cur2'])) 
     { 
      echo "<center><b>Enter Values</b><br></center>"; 
     }else{ 
      $cur2 = $_POST['cur2']; 
     } 
     if($cur1=="EUR" AND $cur2=="USD") 
     { 
      echo "<center><b>Your Converted Amount is:</b><br></center>"; 
      echo "<center>" . $amount*$eurtodollar . "</center>"; 
     } 
} 
    ?> 

и xml код:

<body> 
    <OrigCurrency val="Euro"> 
     <Cube date="2014-06-20"> 
      <Rate currency="USD">1.3764</Rate> 
      <Rate currency="CHF">1.2079</Rate> 
      <Rate currency="GBP">0.8731</Rate> 
     </Cube> 
    </OrigCurrency> 
</body> 
+1

проделал какую-либо базовую отладку, например 'echo $ eurtodollar', чтобы увидеть, что выталкивает simplexml? –

+0

Да, но это было прекрасно с эхом, сразу после вычисления была проблема – MariusB

+0

@MarcB: Это бы бросило ее в строку, которая не объяснила бы, почему это все время. – hakre

ответ

1

Я думаю, что делает переменную с плавающей точкой будет исправить вашу проблему. Чтобы получить значение с плавающей запятой от переменной с SimpleXMLElement, вы можете использовать floatval функцию:

floatval($var); 

FPR пример можно использовать

$result = $amount * floatval($eurtodollar) 
+0

Я вижу, как это работает, я просто хочу поблагодарить вас. если есть другой способ сделать это, вы просто разместите его здесь – MariusB

+0

Upvote и принять его в качестве ответа. Спасибо – souvickcse

0
<?php 
$xml = simplexml_load_file('curr.xml')or die("Error: Cannot create object"); 

$eurtodollar = $xml->OrigCurrency->Cube->Rate[0]; 

if(isset($_POST['submit'])) 
    { 
    $amount = $_POST['amount']; 
    $cur1 = $_POST['cur1']; 
    if(!isset($_POST['cur2'])) 
    { 
     echo "<center><b>Enter Values</b><br></center>"; 
    }else{ 
     $cur2 = $_POST['cur2']; 
    } 
    if($cur1=="EUR" AND $cur2=="USD") 
    { 
     echo "<center><b>Your Converted Amount is:</b><br></center>"; 
     echo "<center>" . ($amount* (float) $eurtodollar) . "</center>"; 
    } 

} >

1

Что? вы испытываете здесь, что если:

$eurtodollar = $xml->OrigCurrency->Cube->Rate[0]; 

Переменная $eurtodollar содержит объект типа SimpleXMLElement.

Когда вы теперь умножаете этот объект на число в PHP, PHP должен делать некоторые преобразования типов, потому что вы не можете умножить объект на число (как вы знаете, вы можете только умножить число на другой номер;)):

var_dump(1 * $eurtodollar); # int(1) 

Таким образом, вы получите обратно целое число 1, которое может быть неожиданным. Это связано с тем, что когда вы multiply an integer с объектом, the object is cast - Boolean, который равен TRUE[1], который затем преобразуется в целое число, которое равно 1 (одно).

Так что вы пишете там

1 * SimpleXMLElement <Rate currency="USD">1.3764</Rate> 
=> 1 * TRUE 
=> 1 * 1 
== 1 

Однако, если вы приводите объект в поплавка, то PHP сначала пытается преобразовать объект в строку (что возможно с SimpleXMLElement, как с любым объект, который имеет __toString() method) и строка затем преобразуется в поплавка который делается РНР, а также:

var_dump(1 * (float) $eurtodollar); # double(1.3764) 

Это и есть:

1 * (float) SimpleXMLElement <Rate currency="USD">1.3764</Rate> 
=> 1 * (float) "1.3764" 
=> 1 * 1.3764 
== 1.3764 

Точно так же вы можете просто только бросить в строку и PHP затем преобразовать его в число раз:

var_dump(1 * (string) $eurtodollar); # double(1.3764) 

Это то:

1 * (string) SimpleXMLElement <Rate currency="USD">1.3764</Rate> 
=> 1 * "1.3764" 
=> 1 * 1.3764 
== 1.3764 

И это вся магия ,

Для получения дополнительной информации см. String conversion to numbers.


[1] Обычно все объекты в PHP будет приведен к Boolean TRUE, однако SimpleXMLElement является особенным здесь, как это может быть Логическое FALSE, а когда пусто (например, <Rate></Rate>). С этим, как с первым элементом, вы будете получать 0 все время.

+0

хорошее объяснение, спасибо alot – MariusB

+0

Спасибо. Я лично также предпочитаю отливки типа '(float) $ var' над вызовом функции' floatval ($ var) ', потому что IMHO более описательно, что делает код (тип преобразования). – hakre

+0

это то, что я сделал. Я новичок, у меня все еще есть проблемы со всеми этими советами – MariusB

Смежные вопросы