将float转换为纯字符串表示形式

Alm*_* Do 13 php format floating-point

所以,

问题

我的问题是关于简单的事情:如何将数字字符串转换为它的普通("本机")表示.这意味着:如果数字字符串已经处于普通视图中,请保持原样,但如果它是科学记数法,则转换它.样品:

"3"          -->  "3"
"1.5"        -->  "1.5"
"-15.482E-2" -->  "-0.15482"

数字字符串应该是有效的,如果不是 - 那么它不是转换的情况(我们可以自由地返回null或空字符串,例如).

用例

这是必要的,bcmath因为它不适用于科学浮标.因此,它们需要转换为普通字符串(在此处询问).这个用例的重要结果是数字字符串可以是1E-300或类似的东西1E+500.因为我们正在合作bcmath- 它的目的是处理这些事情.

我的方法

就目前而言,我已经使用实现了这一点,例如:

function parseFloat($string)
{
   $string = (string)$string;
   if(preg_match('/^[+-]?(\d+|\d+\.\d*)[Ee]([+-]?)(\d+)$/', $string, $matches))
   {
      $precision = false!==($dot=strpos($matches[1], '.'))
                   ?strlen($matches[1])-$dot-1
                   :0;
      $precision = $matches[2]=='-'
                   ?$precision + (int)$matches[3]
                   :$precision - (int)$matches[3];
      return number_format($string, $precision<0?0:$precision, '', '');
   }
   if(preg_match('/^[+-]?(\d+|\d+\.\d+)$/', $string))
   {
      return $string;
   }
}
Run Code Online (Sandbox Code Playgroud)

这个问题

我觉得应该有更简单明智的方法来做到这一点.如何在PHP中以更简单的方式实现这一点?可能是一些棘手的sprintf()格式?

重要提示:我不想处理精确度.我想要黑盒子.在那里传递数字 - 得到字符串作为输出.就这样.不想处理任何其他事情.事实上,我所有的正则表达式都是关于计算长度和精度的 - 所以,当然,如果明确地传递它们(例如参数) - 我们就会摆脱正则表达式.但是 - 不,那不是我想要的.

Ja͢*_*͢ck 10

由于sprintf()"%.f"具有表达式,如麻烦"1e-8",可能需要进行一些文字处理:

function convertFloat($floatAsString)
{
    $norm = strval(floatval($floatAsString));

    if (($e = strrchr($norm, 'E')) === false) {
        return $norm;
    }

    return number_format($norm, -intval(substr($e, 1)));
}
Run Code Online (Sandbox Code Playgroud)

经测试:

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
Run Code Online (Sandbox Code Playgroud)