Convert float to plain string representation
(Updated to use non-depreciated functions as suggested by andufo; I chose explode
, but you could use preg_split
if you wanted. As a side note if anyone still reads down this far, the accepted answer fails - try it with my first and last test case.)
I dug up a little gem from the PHP boards posted by benjcarson in 2002 who noted your exact problem with bcmath and scientific notation
It needed some adjustment (his function didn't set the right scale, and failed on regular decimals, and as pointed out it did not account for the length of decimal places in the scale)
function exp2int($exp) {
list($mantissa, $exponent) = explode("e", strtolower($exp));
if($exponent=='') return $exp;
list($int, $dec) = explode(".", $mantissa);
bcscale (abs($exponent-strlen($dec)));
return bcmul($mantissa, bcpow("10", $exponent));
}
As a side note, your original code fails on any numbers smaller than 1E-40
(As do all the current answers using sprintf)
It would have been easier to debug if you posted more of your test cases, but this works for everything you've posted so far
Test cases:
echo exp2int("-1.82235135978667123456789E5"); \\-182235.135978667123456789
echo exp2int("1.1350865232E-60"); \\0.0000000000000000000000000000000000000000000000000000000000011350865232
echo exp2int("-15.482E-2"); \\-0.15482
echo exp2int("1.5"); \\1.5
echo exp2int("3"); \\3
echo exp2int("123.123e10"); \\1231230000000.000 - you mentioned trailing 0's aren't a problem
echo exp2int("123.123e-10"); \\0.0000000123123
echo exp2int("123456789E-9"); \\0.123456789
echo exp2int("12345.6789E-5"); \\0.123456789
echo exp2int("1E-300"); \\0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
Because sprintf()
with "%.f"
has trouble with expressions such as "1e-8"
, some text processing may be required:
function convertFloat($floatAsString)
{
$norm = strval(floatval($floatAsString));
if (($e = strrchr($norm, 'E')) === false) {
return $norm;
}
return number_format($norm, -intval(substr($e, 1)));
}
Tested with:
3 3
1.5 1.5
-15.482e-2 -0.15482
1e-8 0.00000001
1e+3 1000
-4.66E-2 -0.0466
3e-3 0.003