1
0
mirror of https://github.com/dg/dibi.git synced 2025-08-06 06:07:39 +02:00

Result: fixed normalization of float when ends with "0" [Closes #189]

This commit is contained in:
David Grudl
2015-10-13 13:14:08 +02:00
parent 91c2be2a84
commit 407a6f7550
2 changed files with 83 additions and 1 deletions

View File

@@ -497,7 +497,17 @@ class Result implements IDataSource
$row[$key] = is_float($tmp = $value * 1) ? $value : $tmp;
} elseif ($type === Type::FLOAT) {
$row[$key] = str_replace(',', '.', ltrim((string) ($tmp = (float) $value), '0')) === ltrim(rtrim(rtrim($value, '0'), '.'), '0') ? $tmp : $value;
$value = ltrim($value, '0');
$p = strpos($value, '.');
if ($p !== FALSE) {
$value = rtrim(rtrim($value, '0'), '.');
}
if ($value === '' || $value[0] === '.') {
$value = '0' . $value;
}
$row[$key] = $value === str_replace(',', '.', (string) ($float = (float) $value))
? $float
: $value;
} elseif ($type === Type::BOOL) {
$row[$key] = ((bool) $value) && $value !== 'f' && $value !== 'F';

View File

@@ -57,3 +57,75 @@ test(function () {
Assert::same(['col' => '0'], $result->test(['col' => 0]));
Assert::same(['col' => '1'], $result->test(['col' => 1]));
});
test(function () {
$result = new MockResult;
$result->setType('col', Type::FLOAT);
Assert::same(['col' => NULL], $result->test(['col' => NULL]));
Assert::same(['col' => 1.0], $result->test(['col' => TRUE]));
Assert::same(['col' => 0.0], $result->test(['col' => FALSE]));
Assert::same(['col' => 0.0], $result->test(['col' => '']));
Assert::same(['col' => 0.0], $result->test(['col' => '0']));
Assert::same(['col' => 1.0], $result->test(['col' => '1']));
Assert::same(['col' => 0.0], $result->test(['col' => '.0']));
Assert::same(['col' => 0.1], $result->test(['col' => '.1']));
Assert::same(['col' => 0.0], $result->test(['col' => '0.0']));
Assert::same(['col' => 0.1], $result->test(['col' => '0.1']));
Assert::same(['col' => 0.0], $result->test(['col' => '0.000']));
Assert::same(['col' => 0.1], $result->test(['col' => '0.100']));
Assert::same(['col' => 1.0], $result->test(['col' => '1.0']));
Assert::same(['col' => 1.1], $result->test(['col' => '1.1']));
Assert::same(['col' => 1.0], $result->test(['col' => '1.000']));
Assert::same(['col' => 1.1], $result->test(['col' => '1.100']));
Assert::same(['col' => 1.0], $result->test(['col' => '001.000']));
Assert::same(['col' => 1.1], $result->test(['col' => '001.100']));
Assert::same(['col' => 10.0], $result->test(['col' => '10']));
Assert::same(['col' => 11.0], $result->test(['col' => '11']));
Assert::same(['col' => 10.0], $result->test(['col' => '0010']));
Assert::same(['col' => 11.0], $result->test(['col' => '0011']));
Assert::same(['col' => '0.00000000000000000001'], $result->test(['col' => '0.00000000000000000001']));
Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '12345678901234567890']));
Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '012345678901234567890']));
Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '12345678901234567890.000']));
Assert::same(['col' => '12345678901234567890.1'], $result->test(['col' => '012345678901234567890.100']));
Assert::same(['col' => 0.0], $result->test(['col' => 0]));
Assert::same(['col' => 0.0], $result->test(['col' => 0.0]));
Assert::same(['col' => 1.0], $result->test(['col' => 1]));
Assert::same(['col' => 1.0], $result->test(['col' => 1.0]));
setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
Assert::same(['col' => 0.0], $result->test(['col' => '']));
Assert::same(['col' => 0.0], $result->test(['col' => '0']));
Assert::same(['col' => 1.0], $result->test(['col' => '1']));
Assert::same(['col' => 0.0], $result->test(['col' => '.0']));
Assert::same(['col' => 0.1], $result->test(['col' => '.1']));
Assert::same(['col' => 0.0], $result->test(['col' => '0.0']));
Assert::same(['col' => 0.1], $result->test(['col' => '0.1']));
Assert::same(['col' => 0.0], $result->test(['col' => '0.000']));
Assert::same(['col' => 0.1], $result->test(['col' => '0.100']));
Assert::same(['col' => 1.0], $result->test(['col' => '1.0']));
Assert::same(['col' => 1.1], $result->test(['col' => '1.1']));
Assert::same(['col' => 1.0], $result->test(['col' => '1.000']));
Assert::same(['col' => 1.1], $result->test(['col' => '1.100']));
Assert::same(['col' => 1.0], $result->test(['col' => '001.000']));
Assert::same(['col' => 1.1], $result->test(['col' => '001.100']));
Assert::same(['col' => 10.0], $result->test(['col' => '10']));
Assert::same(['col' => 11.0], $result->test(['col' => '11']));
Assert::same(['col' => 10.0], $result->test(['col' => '0010']));
Assert::same(['col' => 11.0], $result->test(['col' => '0011']));
Assert::same(['col' => '0.00000000000000000001'], $result->test(['col' => '0.00000000000000000001']));
Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '12345678901234567890']));
Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '012345678901234567890']));
Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '12345678901234567890.000']));
Assert::same(['col' => '12345678901234567890.1'], $result->test(['col' => '012345678901234567890.100']));
Assert::same(['col' => 0.0], $result->test(['col' => 0]));
Assert::same(['col' => 0.0], $result->test(['col' => 0.0]));
Assert::same(['col' => 1.0], $result->test(['col' => 1]));
Assert::same(['col' => 1.0], $result->test(['col' => 1.0]));
setlocale(LC_NUMERIC, 'C');
});