From a9f4590ffb748ac24beffc5d18cda991f43f0285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Tue, 13 Sep 2022 16:09:34 +0200 Subject: [PATCH] Fix float export precision --- src/Exporter.php | 12 ++++++++++-- tests/ExporterTest.php | 21 +++++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/Exporter.php b/src/Exporter.php index 41714d9..bb3ac7c 100644 --- a/src/Exporter.php +++ b/src/Exporter.php @@ -209,8 +209,16 @@ protected function recursiveExport(&$value, $indentation, $processed = null) return 'false'; } - if (\is_float($value) && (float) ((int) $value) === $value) { - return "$value.0"; + if (\is_float($value)) { + $precisionBackup = ini_get('precision'); + ini_set('precision', '-1'); + try { + $valueStr = (string) $value; + + return (string) (int) $value === $valueStr ? $valueStr . '.0' : $valueStr; + } finally { + ini_set('precision', $precisionBackup); + } } if ($this->isClosedResource($value)) { diff --git a/tests/ExporterTest.php b/tests/ExporterTest.php index 9dcd2c5..276be6d 100644 --- a/tests/ExporterTest.php +++ b/tests/ExporterTest.php @@ -52,6 +52,13 @@ public function exportProvider() 'export int 1' => [1, '1'], 'export float 1.0' => [1.0, '1.0'], 'export float 1.2' => [1.2, '1.2'], + 'export float 1 / 3' => [1 / 3, '0.3333333333333333'], + 'export float 1 - 2 / 3' => [1 - 2 / 3, '0.33333333333333337'], + 'export float 5.5E+123' => [5.5E+123, '5.5E+123'], + 'export float 5.5E-123' => [5.5E-123, '5.5E-123'], + 'export float NAN' => [\NAN, 'NAN'], + 'export float INF' => [\INF, 'INF'], + 'export float -INF' => [-\INF, '-INF'], 'export stream' => [\fopen('php://memory', 'r'), 'resource(%d) of type (stream)'], 'export stream (closed)' => [$resource, 'resource (closed)'], 'export numeric string' => ['1', "'1'"], @@ -297,12 +304,14 @@ public function shortenedExportProvider() ]; return [ - 'shortened export null' => [null, 'null'], - 'shortened export boolean true' => [true, 'true'], - 'shortened export integer 1' => [1, '1'], - 'shortened export float 1.0' => [1.0, '1.0'], - 'shortened export float 1.2' => [1.2, '1.2'], - 'shortened export numeric string' => ['1', "'1'"], + 'shortened export null' => [null, 'null'], + 'shortened export boolean true' => [true, 'true'], + 'shortened export integer 1' => [1, '1'], + 'shortened export float 1.0' => [1.0, '1.0'], + 'shortened export float 1.2' => [1.2, '1.2'], + 'shortened export float 1 / 3' => [1 / 3, '0.3333333333333333'], + 'shortened export float 1 - 2 / 3' => [1 - 2 / 3, '0.33333333333333337'], + 'shortened export numeric string' => ['1', "'1'"], // \n\r and \r is converted to \n 'shortened export multilinestring' => ["this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext", "'this\\nis\\na\\nvery\\nvery\\nvery...\\rtext'"], 'shortened export empty stdClass' => [new \stdClass, 'stdClass Object ()'],