SO,
Проблема
Мой вопрос о тривиальной вещи: как преобразовать числовую строку в это простое ( "родное" ) представление. Это означает: если числовая строка уже находится в открытом виде, оставьте ее как есть, но если она находится в научной нотации, преобразуйте ее. Пример:
"3" --> "3" "1.5" --> "1.5" "-15.482E-2" --> "-0.15482"
Числовая строка должна быть действительной, а если нет - тогда это не случай преобразования (мы можем, например, возвращать пустую или пустую строку).
Использование случая
Это необходимо для bcmath
, потому что он не может работать с научными поплавками. Таким образом, они должны быть преобразованы в простые строки (задано здесь). Поэтому важным следствием этого варианта использования является то, что числовая строка может быть чем-то вроде 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()
формат?
Важное замечание: я не хочу иметь дело с точностью. Я хочу черный ящик. Передайте что-то числовое - получите строку в качестве вывода. Все это. Не хочу иметь дело ни с чем другим. На самом деле, все мое регулярное выражение - это вычисление длины и точности - так что, конечно, если передать их явно (как параметры, например), мы избавимся от регулярного выражения. Но - нет, это не то, что я хочу.