所以,
问题
我的问题是关于一个琐碎的事情:如何将数字字符串转换为它的纯文本表示。也就是说:如果数字字符串已经是纯文本视图,则保持不变,但如果它是科学计数法,则进行转换。示例:
"3" --> "3" "1.5" --> "1.5" "-15.482E-2" --> "-0.15482"
数字字符串应该是有效的,如果不是,则不能进行转换(例如,我们可以返回null或空字符串)。
用例
这对于这里提问)。因此,这个用例的重要结论是数字字符串可能是诸如1E-300
或1E+500
之类的东西。由于我们正在使用
我的方法
目前,我使用了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()
格式吗?
重要提示:我不想处理精度,我需要的是黑盒子。传递一个数值 - 得到字符串输出。就这样,不想处理其他任何事情。实际上,我的所有正则表达式都是关于计算长度和精度的 - 所以,如果将它们显式地传递(例如作为参数),我们可以摆脱正则表达式。但是 - 不,那不是我想要的。
"1E-8"
上失败了,就像其他任何东西一样。 - Alma Do