converting SimpleXML string to decimal number

I am having an issue in regard to converting a string ("1.9") to a decimal value when SimpleXML is used.

Why does the code below round the value down to 1, and how can i store the full decimal value of the number?
$xmlstr = <<<XML
<numbers>
	<number>
		<value>1.9</value>
	</number>
</numbers>
XML;
 
$xml = new SimpleXMLElement($xmlstr);
$total=0;
foreach ($xml->number as $number) {
	echo '<p>'.$number->value.'</p>'; // 1.9
	$total+=$number->value;
}
echo '<p>'.$total.'</p>'; // 1

Open in new window

astrotoggleAsked:
Who is Participating?
 
Beverley PortlockConnect With a Mentor Commented:
Just use a "cast" to indicate to PHP that you want it handled as a double.

$total += (double) $number->value

Amended code below
<?php
 
$xmlstr = <<<XML
<numbers>
        <number>
                <value>1.9</value>
        </number>
</numbers>
XML;
 
$xml = new SimpleXMLElement($xmlstr);
$total=0;
foreach ($xml->number as $number) {
        echo '<p>'.$number->value.'</p>'; // 1.9
        $total+= (double) $number->value;
}
echo '<p>'.$total.'</p>'; // 1
 
?>

Open in new window

0
 
Chris HarteThaumaturgeCommented:
An xml element is just an array, php does not know that it is a number or a string, it just has a pointer to a memory location. To make the element what you wish it to be you can cast it, as suggested by bportlock, or just parse it with double quotes.

$total += "$number->value";
0
 
Beverley PortlockCommented:
Casting or use of floatval should be preferred as it makes the programmer's intention explicit both to himself and anyone who has to maintain that code. If you think that it is silly to make things clear to yourself, try maintaining code you wrote 12 months ago ....

One other point, never allow systems to run to defaults or set default values - always set them yourself. That way if the default ever changes then your code does not behave unexpectedly. That is what happened here. PHP forced this to an integer, but in PHP6 (say) that behaviour could change. If you depended on this "feature" to truncate floating point strings into integers then upgrading to a new version could break your code. By forcing it with a cast you

- protect your code against environment differences
- document your code
- reduce scope for errors
0
 
astrotoggleAuthor Commented:
easy as that.  thank you very much for your help.  that was starting to do my head in.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.