|
floatval
Get float value of a variable
(PHP 4 >= 4.2.0, PHP 5)
Example 2583. floatval() Example<?php Code Examples / Notes » floatval19-apr-2005 01:30
you can also use typecasting instead of functions: (float) $value; pillepop2003
Use this snippet to extract any float out of a string. You can choose how a single dot is treated with the (bool) 'single_dot_as_decimal' directive. This function should be able to cover almost all floats that appear in an european environment. <?php function float($str, $set=FALSE) { if(preg_match("/([0-9\.,-]+)/", $str, $match)) { // Found number in $str, so set $str that number $str = $match[0]; if(strstr($str, ',')) { // A comma exists, that makes it easy, cos we assume it separates the decimal part. $str = str_replace('.', '', $str); // Erase thousand seps $str = str_replace(',', '.', $str); // Convert , to . for floatval command return floatval($str); } else { // No comma exists, so we have to decide, how a single dot shall be treated if(preg_match("/^[0-9]*[\.]{1}[0-9-]+$/", $str) == TRUE && $set['single_dot_as_decimal'] == TRUE) { // Treat single dot as decimal separator return floatval($str); } else { // Else, treat all dots as thousand seps $str = str_replace('.', '', $str); // Erase thousand seps return floatval($str); } } } else { // No number found, return zero return 0; } } // Examples echo float('foo 123,00 bar'); // returns 123.00 echo float('foo 123.00 bar' array('single_dot_as_decimal'=> TRUE)); //returns 123.000 echo float('foo 123.00 bar' array('single_dot_as_decimal'=> FALSE)); //returns 123000 echo float('foo 222.123.00 bar' array('single_dot_as_decimal'=> TRUE)); //returns 222123000 echo float('foo 222.123.00 bar' array('single_dot_as_decimal'=> FALSE)); //returns 222123000 // The decimal part can also consist of '-' echo float('foo 123,-- bar'); // returns 123.00 ?> Big Up. Philipp zipi
This function converts a string to a float no matter is the decimal separator dot (.) or comma (,). It also converts integers correctly. It takes the digits from the beginning of the string and ignores all other characters. function floatval($strValue) { $floatValue = ereg_replace("(^[0-9]*)(\\.|,)([0-9]*)(.*)", "\\1.\\3", $strValue); if (!is_numeric($floatValue)) $floatValue = ereg_replace("(^[0-9]*)(.*)", "\\1", $strValue); if (!is_numeric($floatValue)) $floatValue = 0; return $floatValue; } -Zipi (Finland) thorcharathotmaildotcom
Please note that conversion is not always correct, if you use a , instead of a . conversion wil return an integer on most servers.
jason
Instead of using floatval which only appeared in PHP 4.2 you could juse use $variable = (float)$variable This function doesn't seem to add any functionality that wasn't already there. leprau
For those of you, who are looking for a function that rips the first, but longest possible float (or at least integer) from a string, like 123.45 from the string "Price: 123,45$" If no useable value is found, the function returns false. Checks for both comma and dot as decimal-separator, but does not check for 3 digits between thousands, so 1,234.5 is as valid as 1,23,4.5 (both will return 1234.5) 12,.3 will return 12 1,000,000 will return 1000.0 ! (if thousands separator is defined, decimals should be defined too ... in fact I was too lazy to check for that too) Here you go, and feel free to optimize the function ;) <?php function getFloat($pString) { if (strlen($pString) == 0) { return false; } $pregResult = array(); $commaset = strpos($pString,','); if ($commaset === false) {$commaset = -1;} $pointset = strpos($pString,'.'); if ($pointset === false) {$pointset = -1;} $pregResultA = array(); $pregResultB = array(); if ($pointset < $commaset) { preg_match('#(([-]?[0-9]+(\.[0-9])?)+(,[0-9]+)?)#', $pString, $pregResultA); } preg_match('#(([-]?[0-9]+(,[0-9])?)+(\.[0-9]+)?)#', $pString, $pregResultB); if ((isset($pregResultA[0]) && (!isset($pregResultB[0]) || strstr($preResultA[0],$pregResultB[0]) == 0 || !$pointset))) { $numberString = $pregResultA[0]; $numberString = str_replace('.','',$numberString); $numberString = str_replace(',','.',$numberString); } elseif (isset($pregResultB[0]) && (!isset($pregResultA[0]) || strstr($pregResultB[0],$preResultA[0]) == 0 || !$commaset)) { $numberString = $pregResultB[0]; $numberString = str_replace(',','',$numberString); } else { return false; } $result = (float)$numberString; return $result; } ?> vickers
floatval() does not work with "$35,234.43", as it could not handle the '$' and the ','. The following takes care of all values, such that only numeric and the decimal sign are input into floatval(). (It probably shows I'm an old 'c' guy)...this function only lightly tested. function strtflt($str) { $il = strlen($str); $flt = ""; $cstr = ""; for($i=0;$i<$il;$i++) { $cstr = substr($str, $i, 1); if(is_numeric($cstr) || $cstr == ".") $flt = $flt.$cstr; } return floatval($flt); } Richard Vickers vickers@hotpop.com anonymous
Easier-to-grasp-function for the ',' problem. function Getfloat($str) { if(strstr($str, ",")) { $str = str_replace(".", "", $str); // replace dots (thousand seps) with blancs $str = str_replace(",", ".", $str); // replace ',' with '.' } if(preg_match("#([0-9\.]+)#", $str, $match)) { // search for number that may contain '.' return floatval($match[0]); } else { return floatval($str); // take some last chances with floatval } } echo Getfloat("$ 19.332,35-"); // will print: 19332.35 aa
@pillepop2003 at yahoo dot de <?php float('-100.00', array('single_dot_as_decimal' => true)); // whoops, returns -10000 ?> use: "/^[0-9-]*[\.]{1}[0-9-]+$/" instead of: "/^[0-9]*[\.]{1}[0-9-]+$/" |
Change Languagedebug_zval_dump doubleval empty floatval get_defined_vars get_resource_type gettype import_request_variables intval is_array is_binary is_bool is_buffer is_callable is_double is_float is_int is_integer is_long is_null is_numeric is_object is_real is_resource is_scalar is_string is_unicode isset print_r serialize settype strval unserialize unset var_dump var_export |