Convert float to plain string representation

后端 未结 4 1539
隐瞒了意图╮
隐瞒了意图╮ 2020-12-31 07:24

SO,

The problem

My question is about trivial thing: how to convert numeric string to it\'s plain (\"native\") representation. That means: if

4条回答
  •  青春惊慌失措
    2020-12-31 07:46

    (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
    

提交回复
热议问题