diff --git a/CHANGELOG.md b/CHANGELOG.md index 62680f62..068cfcc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). - FLOOR() function accept negative number and negative significance [#1245](https://github.com/PHPOffice/PhpSpreadsheet/pull/1245) - Correct column style even when using rowspan [#1249](https://github.com/PHPOffice/PhpSpreadsheet/pull/1249) +- XLSX reader/writer keep decimal for floats with a zero decimal part [#1262](https://github.com/PHPOffice/PhpSpreadsheet/pull/1262) ## [1.10.0] - 2019-11-18 diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index 86ee135b..9b5b7db4 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -729,15 +729,6 @@ class Xlsx extends BaseReader // read empty cells or the cells are not empty if ($this->readEmptyCells || ($value !== null && $value !== '')) { - // Check for numeric values - if (is_numeric($value) && $cellDataType != 's') { - if ($value == (int) $value) { - $value = (int) $value; - } elseif ($value == (float) $value) { - $value = (float) $value; - } - } - // Rich text? if ($value instanceof RichText && $this->readDataOnly) { $value = $value->getPlainText(); diff --git a/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php b/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php index c8e7062d..f460c0f1 100644 --- a/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php +++ b/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php @@ -1135,6 +1135,13 @@ class Worksheet extends WriterPart break; case 'n': // Numeric + //force a decimal to be written if the type is float + if (is_float($cellValue)) { + $cellValue = (string) $cellValue; + if (strpos($cellValue, '.') === false) { + $cellValue = $cellValue . '.0'; + } + } // force point as decimal separator in case current locale uses comma $objWriter->writeElement('v', str_replace(',', '.', $cellValue)); diff --git a/tests/PhpSpreadsheetTests/Writer/Xlsx/FloatsRetainedTest.php b/tests/PhpSpreadsheetTests/Writer/Xlsx/FloatsRetainedTest.php new file mode 100644 index 00000000..521cc47f --- /dev/null +++ b/tests/PhpSpreadsheetTests/Writer/Xlsx/FloatsRetainedTest.php @@ -0,0 +1,54 @@ +getActiveSheet()->getCell('A1')->setValue($value); + + $writer = new Writer($sheet); + $writer->save($outputFilename); + + $reader = new Reader(); + $sheet = $reader->load($outputFilename); + + $this->assertSame($value, $sheet->getActiveSheet()->getCell('A1')->getValue()); + } + + public function providerIntyFloatsRetainedByWriter() + { + return [ + [-1.0], + [-1], + [0.0], + [0], + [1.0], + [1], + [1e-3], + [1.3e-10], + [1e10], + [3.00000000000000000001], + [99999999999999999], + [99999999999999999.0], + [999999999999999999999999999999999999999999], + [999999999999999999999999999999999999999999.0], + ]; + } +}