加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 将浮点数转换为纯字符串表示形式

发布时间:2020-12-13 13:57:15 所属栏目:PHP教程 来源:网络整理
导读:所以, 问题 我的问题是关于微不足道的事情:如何将数字字符串转换为plain(“native”)表示形式.这意味着:如果数字字符串已经在纯视图中,请保留原样,但如果是科学符号,则将其转换.样品: "3" -- "3""1.5" -- "1.5""-15.482E-2" -- "-0.15482" 数字字符串应该
所以,

问题

我的问题是关于微不足道的事情:如何将数字字符串转换为plain(“native”)表示形式.这意味着:如果数字字符串已经在纯视图中,请保留原样,但如果是科学符号,则将其转换.样品:

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

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

用例

这是bcmath所需要的,因为它不能与科学的浮标一起工作.因此,它们需要转换为纯字符串(请问here).这个用例的重要后果是数字字符串可以是像1E-300或1E 500这样的东西.由于我们正在使用bcmath – 它的目的是处理这样的事情.

我的做法

现在,我已经实现了regex-almighty,像:

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;
   }
}

问题

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

重要提示:我不想处理精度.我想要黑盒子传递一些数字的东西 – 将字符串作为输出.就这样.不想处理任何事情.事实上,我所有的正则表达式都是关于计算长度&精确 – 所以,当然,如果明确地传递它们(作为参数),我们可以摆脱正则表达式.但是 – 不,这不是我想要的.

因为带有“%.f”的sprintf()具有诸如“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)));
}

经测试:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读