Converting a PHP string number into a numeric value

Despite seeming like a very basic procedure, this evening I found I had wasted half an hour, split between Googling for the answer and trying to work it out for myself.

I have a number that needs to be stored in a string format in PHP. However, I need to use this value at some point to run a calculation, for which I need the true value as opposed to the string. If I had just wanted a whole number the answer is very simple, use the PHP (int) method to convert it.

It is not that easy when you are working with decimals. Unless I am missing something (in which case feel free to embarass me in the comments below!) there is no easy way to do this. Here is what I came up with:

$string = "3.142";        // The source number, as a string
$a = explode(".",$string);            // Split the string, using the decimal point as separator
$int = $a[0];                        // The section before the decimal point
$dec = $a[1];                        // The section after the decimal point
$lengthofnum=strlen($dec);            // Get the num of characters after the decimal point
$divider="1";                        // This sets the divider at 1
$i=0;
while($i < ($lengthofnum)) {
$divider.="0";                    // Adds a zero to the divider for every char after the decimal point
$i++;
}
$divider=(int)$divider;                // Converts the divider (currently a string) to an integer
$total=$int+($dec/$divider);        // compiles the total back as a numeric value

If anyone knows of a quicker / cleaner / better / more funky way of doing this simple task please do let me know… if not then I hope this little snippet at least lets you avoid losing the half our of your life that I lost this evening!

UPDATE: Thanks to Xobman, who Twittered me this little gem:

Try $foo = “3.123”; $bar = (float) $foo;

LOL… low and behold, it works! That’ll teach me to post my (oh so clever!) code on the Interweb for all to see 😀

Thanks Xobman!

21 replies
  1. Lyndi
    Lyndi says:

    Any hour spent coding cannot be a waste, you always learn something from the experience. At least now we know that Twitter can indeed be very handy.

    Reply
  2. Jim
    Jim says:

    @Rarst + Lyndi: You’re right, these things are often a lot easier than they first seem. Also, Twitter does seem a great way of asking these questions. Just a shame in my case I asked the question AFTER I had spent the time 😀

    Reply
  3. Stan
    Stan says:

    It’s still not so easy if the string cotains thousands separators or other such nonsense. For example, “$12,500.05”.

    What I do is split at the decimal point as noted above ie: explode(‘.’,$string).

    Next, I use count() to make sure that my array has no more than two entries, otherwise I error out because if there is more than 1 decimal point, there’s obviously big problems with the string.

    Then I use ereg_replace(“[^[:digit:]]”,””,$arr[x]) to strip out all non-numeric characters from both array entries.

    Finally I put it all back together and create a float, $number = (float) “$arr[0].$arr[1]”

    Reply
  4. Zach M
    Zach M says:

    I need to go the other way around. I have a phone number I need to convert to a number. Like this: 555-555-5555 to 5555555555. How do I get rid of the dashes?

    Reply
  5. Jay Ruiz
    Jay Ruiz says:

    Use str_replace.

    I need to go the other way around. I have a phone number I need to convert to a number. Like this: 555-555-5555 to 5555555555. How do I get rid of the dashes?

    Reply
  6. kiki
    kiki says:

    I have a string $a = ‘AT0001’
    and I need it become ‘AT0002’ in the next entry automatically and become ‘AT0003’ , ‘AT0025’ and so on..
    please could someone help me how to do it?

    Reply
  7. Fab
    Fab says:

    Am I missing something or this just works fine:

    echo gettype( (“12.123” + 0) );
    => double

    echo gettype( (“12” + 0) );
    => integer

    ?

    Reply

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *