mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-25 17:56:18 +00:00
7689037b60
Fix #1324, which went stale many years ago, and is now re-opened. It can be considered a follow-on to PR #4479 which was installed in May. The user complains of a *very* small loss of precision. This can be corrected by using `StringHelper::convertToString` in lieu of a simple cast from float to string in two places. `Style\NumberFormat\Formatter` is quite straightforward. `Writer\Csv` is a bit more complicated. If you put a float with more than 15 digits precision in a Csv, on opening it Excel will give a pop-up, saying something inaccurate like "We've corrected this for you - is that okay?" Better to avoid that by making sure to avoid too much precision when writing to Csv.
49 lines
1.6 KiB
PHP
49 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace PhpOffice\PhpSpreadsheetTests\Shared;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheet\Writer\Csv as CsvWriter;
|
|
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
|
|
|
|
class Issue1324Test extends AbstractFunctional
|
|
{
|
|
protected static int $version = 80400;
|
|
|
|
public function testPrecision(): void
|
|
{
|
|
$string1 = '753.149999999999';
|
|
$s1 = (float) $string1;
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$sheet->getCell('A1')->setValue($s1);
|
|
self::assertNotSame(753.15, $sheet->getCell('A1')->getValue());
|
|
$formats = ['Csv', 'Xlsx', 'Xls', 'Ods', 'Html'];
|
|
foreach ($formats as $format) {
|
|
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, $format);
|
|
$rsheet = $reloadedSpreadsheet->getActiveSheet();
|
|
$s2 = $rsheet->getCell('A1')->getValue();
|
|
self::assertSame($s1, $s2, "difference for $format");
|
|
$reloadedSpreadsheet->disconnectWorksheets();
|
|
}
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function testCsv(): void
|
|
{
|
|
$string1 = '753.149999999999';
|
|
$s1 = (float) $string1;
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$sheet->getCell('A1')->setValue($s1);
|
|
$writer = new CsvWriter($spreadsheet);
|
|
ob_start();
|
|
$writer->save('php://output');
|
|
$output = (string) ob_get_clean();
|
|
self::assertStringContainsString($string1, $output);
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
}
|