Skip to content

Commit 88bbac9

Browse files
authored
Use Locale-Independent Float Conversion for Xlsx Writer Custom Property (PHPOffice#3099)
Fix PHPOffice#3095. Issue is not a problem for Php8, but is for 7.4. Code used to write Xml for float custom property uses locale-dependent (in Php7) cast. Change to use locale-independent (all Php releases) `sprintf('%F'...)` instead.
1 parent cd9811c commit 88bbac9

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

src/PhpSpreadsheet/Writer/Xlsx/DocProps.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ public function writeDocPropsCustom(Spreadsheet $spreadsheet)
216216

217217
break;
218218
case Properties::PROPERTY_TYPE_FLOAT:
219-
$objWriter->writeElement('vt:r8', $propertyValue);
219+
$objWriter->writeElement('vt:r8', sprintf('%F', $propertyValue));
220220

221221
break;
222222
case Properties::PROPERTY_TYPE_BOOLEAN:

tests/PhpSpreadsheetTests/Writer/Xlsx/LocaleFloatsTest.php

+25-11
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
44

5-
use PHPUnit\Framework\TestCase;
5+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
6+
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
67

7-
class LocaleFloatsTest extends TestCase
8+
class LocaleFloatsTest extends AbstractFunctional
89
{
910
/**
1011
* @var bool
@@ -16,6 +17,12 @@ class LocaleFloatsTest extends TestCase
1617
*/
1718
private $currentLocale;
1819

20+
/** @var ?Spreadsheet */
21+
private $spreadsheet;
22+
23+
/** @var ?Spreadsheet */
24+
private $reloadedSpreadsheet;
25+
1926
protected function setUp(): void
2027
{
2128
$this->currentLocale = setlocale(LC_ALL, '0');
@@ -34,6 +41,14 @@ protected function tearDown(): void
3441
if ($this->localeAdjusted && is_string($this->currentLocale)) {
3542
setlocale(LC_ALL, $this->currentLocale);
3643
}
44+
if ($this->spreadsheet !== null) {
45+
$this->spreadsheet->disconnectWorksheets();
46+
$this->spreadsheet = null;
47+
}
48+
if ($this->reloadedSpreadsheet !== null) {
49+
$this->reloadedSpreadsheet->disconnectWorksheets();
50+
$this->reloadedSpreadsheet = null;
51+
}
3752
}
3853

3954
public function testLocaleFloatsCorrectlyConvertedByWriter(): void
@@ -42,18 +57,17 @@ public function testLocaleFloatsCorrectlyConvertedByWriter(): void
4257
self::markTestSkipped('Unable to set locale for testing.');
4358
}
4459

45-
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
60+
$this->spreadsheet = $spreadsheet = new Spreadsheet();
61+
$properties = $spreadsheet->getProperties();
62+
$properties->setCustomProperty('Version', 1.2);
4663
$spreadsheet->getActiveSheet()->setCellValue('A1', 1.1);
4764

48-
$filename = 'decimalcomma.xlsx';
49-
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
50-
$writer->save($filename);
51-
52-
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
53-
$spreadsheet = $reader->load($filename);
54-
unlink($filename);
65+
$this->reloadedSpreadsheet = $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
5566

56-
$result = $spreadsheet->getActiveSheet()->getCell('A1')->getValue();
67+
$result = $reloadedSpreadsheet->getActiveSheet()->getCell('A1')->getValue();
68+
self::assertEqualsWithDelta(1.1, $result, 1.0E-8);
69+
$prop = $reloadedSpreadsheet->getProperties()->getCustomPropertyValue('Version');
70+
self::assertEqualsWithDelta(1.2, $prop, 1.0E-8);
5771

5872
$actual = sprintf('%f', $result);
5973
self::assertStringContainsString('1,1', $actual);

0 commit comments

Comments
 (0)