diff --git a/src/Dibi/Result.php b/src/Dibi/Result.php index 328f05fc..ffba3df1 100644 --- a/src/Dibi/Result.php +++ b/src/Dibi/Result.php @@ -466,7 +466,16 @@ private function normalize(array &$row): void : $tmp; } elseif ($type === Type::FLOAT) { - $value = ltrim((string) $value, '0'); + $value = (string) $value; + + $negative = false; + if ($value !== '' && $value[0] === '-') { + $value = substr($value, 1); + $negative = true; + } + + $value = ltrim($value, '0'); + $p = strpos($value, '.'); $e = strpos($value, 'e'); if ($p !== false && $e === false) { @@ -479,6 +488,10 @@ private function normalize(array &$row): void $value = '0' . $value; } + if ($negative) { + $value = '-' . $value; + } + $row[$key] = $value === str_replace(',', '.', (string) ($float = (float) $value)) ? $float : $value; diff --git a/tests/dibi/Result.normalize.phpt b/tests/dibi/Result.normalize.phpt index cd848465..38331ee1 100644 --- a/tests/dibi/Result.normalize.phpt +++ b/tests/dibi/Result.normalize.phpt @@ -117,6 +117,42 @@ test('', function () { Assert::same(['col' => '1.1e+10'], $result->test(['col' => '001.1e+10'])); Assert::notSame(['col' => '1.1e+1'], $result->test(['col' => '1.1e+10'])); + // Same but negative + 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])); + + Assert::same(['col' => '-1.1e+10'], $result->test(['col' => '-1.1e+10'])); + Assert::same(['col' => '-1.1e-10'], $result->test(['col' => '-1.1e-10'])); + Assert::same(['col' => '-1.1e+10'], $result->test(['col' => '-001.1e+10'])); + Assert::notSame(['col' => '-1.1e+1'], $result->test(['col' => '-1.1e+10'])); + 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'])); @@ -147,6 +183,38 @@ test('', function () { 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])); + + // Same but negative + 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'); });