Use Locale-Independent Float Conversion for Xlsx Writer Custom Property (#3099)
Fix #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.
This commit is contained in:
parent
cd9811cbd3
commit
88bbac9849
|
|
@ -216,7 +216,7 @@ class DocProps extends WriterPart
|
|||
|
||||
break;
|
||||
case Properties::PROPERTY_TYPE_FLOAT:
|
||||
$objWriter->writeElement('vt:r8', $propertyValue);
|
||||
$objWriter->writeElement('vt:r8', sprintf('%F', $propertyValue));
|
||||
|
||||
break;
|
||||
case Properties::PROPERTY_TYPE_BOOLEAN:
|
||||
|
|
|
|||
|
|
@ -2,9 +2,10 @@
|
|||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
|
||||
|
||||
class LocaleFloatsTest extends TestCase
|
||||
class LocaleFloatsTest extends AbstractFunctional
|
||||
{
|
||||
/**
|
||||
* @var bool
|
||||
|
|
@ -16,6 +17,12 @@ class LocaleFloatsTest extends TestCase
|
|||
*/
|
||||
private $currentLocale;
|
||||
|
||||
/** @var ?Spreadsheet */
|
||||
private $spreadsheet;
|
||||
|
||||
/** @var ?Spreadsheet */
|
||||
private $reloadedSpreadsheet;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->currentLocale = setlocale(LC_ALL, '0');
|
||||
|
|
@ -34,6 +41,14 @@ class LocaleFloatsTest extends TestCase
|
|||
if ($this->localeAdjusted && is_string($this->currentLocale)) {
|
||||
setlocale(LC_ALL, $this->currentLocale);
|
||||
}
|
||||
if ($this->spreadsheet !== null) {
|
||||
$this->spreadsheet->disconnectWorksheets();
|
||||
$this->spreadsheet = null;
|
||||
}
|
||||
if ($this->reloadedSpreadsheet !== null) {
|
||||
$this->reloadedSpreadsheet->disconnectWorksheets();
|
||||
$this->reloadedSpreadsheet = null;
|
||||
}
|
||||
}
|
||||
|
||||
public function testLocaleFloatsCorrectlyConvertedByWriter(): void
|
||||
|
|
@ -42,18 +57,17 @@ class LocaleFloatsTest extends TestCase
|
|||
self::markTestSkipped('Unable to set locale for testing.');
|
||||
}
|
||||
|
||||
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
|
||||
$this->spreadsheet = $spreadsheet = new Spreadsheet();
|
||||
$properties = $spreadsheet->getProperties();
|
||||
$properties->setCustomProperty('Version', 1.2);
|
||||
$spreadsheet->getActiveSheet()->setCellValue('A1', 1.1);
|
||||
|
||||
$filename = 'decimalcomma.xlsx';
|
||||
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
|
||||
$writer->save($filename);
|
||||
$this->reloadedSpreadsheet = $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
|
||||
|
||||
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
|
||||
$spreadsheet = $reader->load($filename);
|
||||
unlink($filename);
|
||||
|
||||
$result = $spreadsheet->getActiveSheet()->getCell('A1')->getValue();
|
||||
$result = $reloadedSpreadsheet->getActiveSheet()->getCell('A1')->getValue();
|
||||
self::assertEqualsWithDelta(1.1, $result, 1.0E-8);
|
||||
$prop = $reloadedSpreadsheet->getProperties()->getCustomPropertyValue('Version');
|
||||
self::assertEqualsWithDelta(1.2, $prop, 1.0E-8);
|
||||
|
||||
$actual = sprintf('%f', $result);
|
||||
self::assertStringContainsString('1,1', $actual);
|
||||
|
|
|
|||
Loading…
Reference in New Issue