diff --git a/src/Dibi/Result.php b/src/Dibi/Result.php index 7de40b3b..a7547ad8 100644 --- a/src/Dibi/Result.php +++ b/src/Dibi/Result.php @@ -494,7 +494,9 @@ class Result implements IDataSource $row[$key] = (string) $value; } elseif ($type === Type::INTEGER) { - $row[$key] = is_float($tmp = $value * 1) ? $value : $tmp; + $row[$key] = is_float($tmp = $value * 1) + ? (is_string($value) ? $value : (int) $value) + : $tmp; } elseif ($type === Type::FLOAT) { $value = ltrim($value, '0'); diff --git a/tests/dibi/Result.normalize.phpt b/tests/dibi/Result.normalize.phpt index 6a96d0d2..6ceaf918 100644 --- a/tests/dibi/Result.normalize.phpt +++ b/tests/dibi/Result.normalize.phpt @@ -129,3 +129,29 @@ test(function () { Assert::same(['col' => 1.0], $result->test(['col' => 1.0])); setlocale(LC_NUMERIC, 'C'); }); + + +test(function () { + $result = new MockResult; + $result->setType('col', Type::INTEGER); + + Assert::same(['col' => NULL], $result->test(['col' => NULL])); + Assert::same(['col' => 1], $result->test(['col' => TRUE])); + Assert::same(['col' => 0], $result->test(['col' => FALSE])); + + Assert::same(['col' => 0], $result->test(['col' => ''])); + Assert::same(['col' => 0], $result->test(['col' => '0'])); + Assert::same(['col' => 1], $result->test(['col' => '1'])); + Assert::same(['col' => 10], $result->test(['col' => '10'])); + Assert::same(['col' => 11], $result->test(['col' => '11'])); + Assert::same(['col' => 10], $result->test(['col' => '0010'])); + Assert::same(['col' => 11], $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' => '012345678901234567890'], $result->test(['col' => '012345678901234567890'])); + + Assert::same(['col' => 0], $result->test(['col' => 0])); + Assert::same(['col' => 0], $result->test(['col' => 0.0])); + Assert::same(['col' => 1], $result->test(['col' => 1])); + Assert::same(['col' => 1], $result->test(['col' => 1.0])); +});