Přetypovávání výstupu
- crempa
- Člen | 198
Zdravím,
vím, že se tu o tom už mluvilo, ale realizováno to asi ještě není… Mluvím o přetypování výstupu hodnot z formuláře např. podle pravidel Form::INTEGER apod.
Pokud mě teď sedí názvy form. polí s názvy sloupců v tabulce tak lze
spojení tabulka->formulář řešit velice jednoduše, jediným problémem
je, že vše leze z Forms jako string, což např. u MySQL asi není zas
takovej problém (ale i to je na diskusi.. vadí že nechávám přetypování
až na databázi?).
Lze to teď řešit nějak elegantněji než položky výstupního pole
přetypovávat ručně?
Díky, P.
- Jod
- Člen | 701
Wiki hovorí o PHP:
Typová kontrola: slabá, dynamická
PHP pretypováva samo, pri porovnávani by sa tomu malo dať vyhnúť pomocou ===. A myslím, že ručné pretypovanie funguje cez (int)$cislo, (string)$retazec. Takže si to môžeš keď tak prehnať cez nejakú funkciu. Ale rozšíriť objekt o túto funkcionalitu, dokým nebude v nette.
- mlady
- Člen | 24
Jod napsal(a):
Wiki hovorí o PHP:
Typová kontrola: slabá, dynamická
PHP pretypováva samo, pri porovnávani by sa tomu malo dať vyhnúť pomocou ===. A myslím, že ručné pretypovanie funguje cez (int)$cislo, (string)$retazec. Takže si to môžeš keď tak prehnať cez nejakú funkciu. Ale rozšíriť objekt o túto funkcionalitu, dokým nebude v nette.
Myslim, ze priamo v Nette by to predsalen bolo lepsie. Jednoduche (rucne alebo automaticke) pretypovanie nemusi v nasich podmienkach vzdy pracovat tak ako chceme:
$t = "0,123456";
var_dump($t); // string(8) "0,123456"
var_dump((float) $t); // float(0)
var_dump(StrTr($t, ",", ".")); // string(8) "0.123456"
var_dump((float) StrTr($t, ",", ".")); // float(0.123456)
Editoval mlady (13. 2. 2009 14:30)
- crempa
- Člen | 198
Tak ručně to půjde o tom žádná, jen mě to přijde jako práce navíc, když už na jednom místě říkám, že prvek musí být celé číslo (přes Form::INTEGER…)
Snad bych si to i do formulářů dopsal ale vrtání v cizím kódu mě dělá celkem problém takže kdyby někdo věděl kam něco na způsob
<?php
...
$value = (($rule == Forms::INTEGER) ? (int)$value : $value);
...
?>
doplnit nebo mě nasměroval budu rád :-)
Díky
- Jan Tvrdík
- Nette guru | 2595
crempa napsal(a):
Tak ručně to půjde o tom žádná, jen mě to přijde jako práce navíc, když už na jednom místě říkám, že prvek musí být celé číslo (přes Form::INTEGER…)
Řešilo se to v topicu 967-upravit-chovani-validace-formularu, ale nevím, jak to nakonec dopadlo.
- paranoiq
- Člen | 392
@mlady: to s těmi čísly není dobrý příklad. automatika by zrovna u floatu byla na místě, pokud by se to dalo vyřešit obecně. ale takové řešení bohužel neexistuje:
<?php
// ok
$t = "123,45";
$t = "123.45";
// ok
$t = "123,456.789";
$t = "123.456,789";
$t = "123 456,789";
// stále ok
$t = "123456.789";
$t = "123456,789";
// i tohle je ok
$t = "123 456";
// a teď babo raď! jsou to destiny či tisíce?
$t = "123.456";
$t = "123,456";
?>
takže tohle by si měl rozhodnout sám autor aplikace pomocí jazykových nastavení
Editoval paranoiq (13. 2. 2009 17:24)
- kravčo
- Člen | 721
paranoiq napsal(a):
@mlady: to s těmi čísly není dobrý příklad. automatika by zrovna u floatu byla na místě, pokud by se to dalo vyřešit obecně. ale takové řešení bohužel neexistuje:
<?php // ok $t = "123,45"; $t = "123.45"; // ok $t = "123,456.789"; $t = "123.456,789"; $t = "123 456,789"; // stále ok $t = "123456.789"; $t = "123456,789"; // i tohle je ok $t = "123 456"; // a teď babo raď! jsou to destiny či tisíce? $t = "123.456"; $t = "123,456"; ?>
S tými ok úplne nesúhlasím. Z môjho pohľadu je
v slovenskom kontexte číslo 123,456.789
chybné,
pričom v anglickom správne. Ako píšeš, všeobecné riešenie neexistuje,
no konkrétne – pre slovenské čísla – áno.
Rovnaký problém, nie v zápise ale vo význame, môže byť pri dátume (dd-mm-yy vs. mm-dd-yy).
takže tohle by si měl rozhodnout sám autor aplikace pomocí jazykových nastavení
Nette by toto riešiť mohlo, no na základe locale, či vlastných nastavení, ktoré by si autor vedel prispôsobiť…