将以字符串表示的指数数转换为十进制数

8
假设我有一个包含“7.2769482308e+01”的字符串(这个数字来自第三方软件,我无法控制格式),请问如何以最便宜的方式将其转换为十进制数72.769482308
我唯一能想到的解决方法是分离小数和指数部分并使用乘法。但也许有一些内置函数可以完成同样的工作? 注意:大家好,是的,我已经阅读了在PHP中将指数转换为整数在PHP中将指数数转换为十进制数。但那些问题与本问题不相关,因为它们已经有一个数字,而我只有一个字符串
4个回答

16

那么将值强制转换为浮点数类型呢?

$string = "7.2769482308e+01";
$float  = (float) $string;

哈哈,出乎意料的简单... 从未想到 PHP 可以在强制类型转换中识别字符串指数格式。这种行为有文档记录吗? - zerkms
1
@zerkms 是的。http://php.net/manual/en/language.types.string.php#language.types.string.conversion 和 http://php.net/manual/en/language.types.float.php - Wiseguy
是的,在文档中有相关内容:http://ru.php.net/manual/en/language.types.string.php#language.types.string.conversion - zerkms
1
@zerkms: http://www.php.net/manual/zh/language.types.string.php#language.types.string.conversion - Jon
@hsz:绝对不会在那个杂耍页面上;-) - zerkms

13

我成功地使用了number_format(1.2378147769392E+14, 0, '', ''),该函数最初是由这个问题提供的。

当数值为字符串时,如下所示,此方法同样适用:number_format("1.2378147769392E+14", 0, '', '')。试试看吧。


7
哎呀,这话说得挺刻薄的……你有试过吗?因为这个方法适用于值是字符串或非字符串的情况。 - jwhat
有没有任何理由更喜欢 (float) $string 这个解决方案,而不是一个几乎短了一倍且更易读的解决方案呢?PS:它们并不苛刻,这不是最初版本的答案。PPS:number_format 接受数字作为第一个参数,因此字符串会被隐式转换。PPPS:结果是一个字符串,因此需要执行另一个转换才能获得小数/浮点数。 - zerkms
不知为何,$float = (float) $string; 比 $float = number_format($string, 0, '', '') 要短两倍。哈哈,我想 OP 喝了太多咖啡了。顺便说一句,好答案!我刚才点了赞。 - Robert Sinclair

1

针对 E 后面的数字位数进行动态处理会更好。

使用 explode 获取这些数字精度,并使用 sprintf 进行格式化。

代码片段:

<?php

function getFormattedDecimal($str){
    $precision = explode("e", strtolower($str));
    $precision = substr($precision[1], 1); // remove + and - operators
    return sprintf("%.".$precision."f", $str);
}

在线演示

注意:sprintf可能会根据小数样式四舍五入。


0

这里有一个非常便宜的方法:$float = "7.2769482308e+01" + 0;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接