Řešení pro čísla s desetinným místem
- romanm
- Člen | 27
Ahoj, trochu teď po upgradu na novější MariaDB (10.3) řešíme striktní režim databáze. Nechceme ho vypínat, ale spíš opravit aplikaci aby nemohla prasit jako do teď :)
Konkrétně teď řeším ukládání čísel s desetinným místem.
Aktuální stav
function komponenta()
{
...
$form->addText('price', 'Cena')
->addRule(Form::FLOAT, 'Zadejte číslo');
...
}
function zpravujForm($values)
{
...
$db->insert($values)
...
}
Za předpokladu že uživatel nezadá žádnou hodnotu do tohoto inputu, tak vrácený obsah je '' → a samozřejmě prázdný string neprojde do databáze, kde sloupec je decimal.
Jak řešíte formuláře s desetinnými místy a ukládání jejich dat? Napadá mě prostě tyto inputy ošetřovat ve zpracování
function zpravujForm($values)
{
...
$values['price'] = $values['price'] ?: null;
$db->insert($values)
...
}
Předem díky za rady nebo nakopnutí správným směrem
- galab
- Backer | 74
$form->addText('price', 'Cena')
->addRule(Form::FLOAT, 'Zadejte číslo');
->setNullable();
- Matúš Matula
- Člen | 257
A ako osetrujete tu cenu samotnu? ze to bude mat ozaj validny format ceny, napr. ze tam neda niekto 4 desatinne miesta a pod.?
- m.brecher
- Generous Backer | 863
@MatúšMatula
A ako osetrujete tu cenu samotnu? ze to bude mat ozaj validny format ceny, napr. ze tam neda niekto 4 desatinne miesta a pod.?
HTML formulářové prvky nepodporují uspokojivě číselné typy jako integer nebo float. Typicky požadujeme např. pro vstup čísel do faktury float na dvě desetinná místa. Nejlepší řešení je neumožnit uživateli vložit více jak dvě desetinná místa maskováním vstupu a automaticky konvertovat na dvě desetinná místa pokud vloží jedno desetinné místo nebo integer (doplnit příslušné nuly). HTML to neumí a řešit to Nette validací není nejlepší řešení. Ideálním řešením by byl speciální Nette formulářový prvek na bázi html + trochu javascriptu. Možná už něco takového existuje někde na GitHubu, předpokládám, že každý Nette vývojář musí občas takovýto problém řešit.
- dms
- Člen | 93
Na to je přeci v HTML přímo input https://developer.mozilla.org/…input/number a pokud chci desetiny tak dám step atribut např step=0.01 pro 2 desetinná místa
- m.brecher
- Generous Backer | 863
@dms
Jó uniklo mě v dokumentaci html, že lze nastavit input type=„number“ step=„0.01“, příklad je zde:
https://developer.mozilla.org/…input/number#…
jenže toto nastavení ovládá vkládací šipky a nezabrání vložení nesprávné hodnoty třeba 6.001, že je hodnota nesprávná se pozná, až při validaci, není to tedy ono maskování vstupu, které je myslím ideální a navíc šipky vkládající hodnotu jsou tak malé, že je reálné použití šipek problematické