New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
detectTypes pro typ decimal vrací string #67
Comments
To je kontrola proti zaokrouhlování v PHP, aby se předešlo ztrátě desetinných míst. S celými čísly to nefunguje moc pěkně, vadí Ti to v něčem? |
Trápí mě to při výpisu do tabulky. Většinu hodnot mám celočíselných a některé s desetinným. Aby se zobrazily všechny stejně, musím to přetypovat na float. To není až takový problém, ale pokud je zapnutá autodetekce, tak bych očekával, že už to float bude. Konkrétně u decimalu by se ztrátou desetinných míst ale neměl být problém, protože má stejně fixní počet, takže tam ta kontrola asi nebude potřeba. Úplně nejlepší by tedy bylo doplnit tam podmínku přímo na celočíselný decimal, protože jinde problém nebude. Asi by to vyřešilo toto: $row[$key] = (string) ($tmp = (float) $value) === rtrim(rtrim($value,"0"),".") ? $tmp : $value; Oříznou se koncové nuly (a případná tečka) a až následně se porovnává. Nevím ale, jaký vliv to bude mít na zmíněné zaokrouhlování. |
Říkám si, jestli nenechat detekovaná desetinná čísla vždy jako string. Nekonzistence vráceného typu může člověka překvapit. A kdyby někdo chtěl, natvrdo by mohl uvést |
Teď se float převede na string pouze pokud tím zachrání desetinná místa. To mi přijde ještě rozumné. V tomhle případě ale naráží na nuly na konci, takže nic nezachraňuje. Takže bych buď trimoval nuly a nebo zpracování decimalů řešil samostatně, protože tam se desetinná místa neztrácí. |
Chápu problém i jak ho opravit. Ale když bude desetinných míst hodně a PHP zaokrouhlí, dibi vrátí jednou string, jednou float. Proto jsem pro bezpečný string, programátor obeznámený s float implementací na PHP si může chování vynutit. |
Pokud je sloupec typu decimal (8,3) a z databáze se čte celé číslo, mysql vrátí třeba "123.000". V dibi se detekuje jako decimal, takže se použije float. Na řádku 516 v DibiResult (metoda normalize) se ale provádí ještě jedna kontrola:
$row[$key] = (string) ($tmp = (float) $value) === $value ? $tmp : $value;
Pokud se pak vypisuje a ve sloupci decimal mám v jednom řádku hodnotu "123.001" a v druhém "123.000", tak první se převede správně na float, ale druhý se vrátí jako string.
Testováno na MySQL se stable dibi 2.0.1
The text was updated successfully, but these errors were encountered: