Automaticky dělat trim a vyházet white space znaky z čísel

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Petr Motejlek
Člen | 293
+
0
-

Ahoj,
chtěl bych se zeptat, zda-li současný stav Nette\Forms počítá například s tím, že uživatel do fomulářového input boxu napíše do pole pro číslo (AppForm::FLOAT, AppForm::INTEGER) řetězec ve tvaru „1 500“ (bez uvozovek samozřejmě)? Co jsem zkoušel, tak to vyhodí chybu, že input box není číslo. Mě by docela zajímalo, zda-li by bylo možné to chování trošku pozměnit a to tak, aby jak validace na straně PHP, tak v klientském JavaScriptu automaticky trimovala a vymazávala všechny whitespace znaky ze zadaného řetězce, který má být číslo?

Použití: např. chci po někom telefonní číslo, nebo jen jeho část, řekněmě, že ho nechám v selectboxu vybrat předvolbu jeho země a pak ho nechám vyplnit do input boxu zbytek toho jeho telefonního čísla (můžu ten inputbox třeba omezit podle nejdelšího tel. čísla, se kterým jsem se setkal, na tom nesejde) — myslím, že dost lidí napadne tam vepsat zbytek toho telefonního čísla ve tvaru XXX XXX XXX (protože to třeba odněkud kopírují, nebo jen slepě přepisují a ty mezery se jim tam prostě vloudily). V takovou chvíli jim validace jak na straně serveru, tak na straně klienta, zaječí, že jsou hloupí, že nezadali číšlo. Ten stejný problém se vyskytne i např. u jiných služeb, kde je identifikátorem člověka nějaké číslo (např. ICQ, apod.).

Šlo by tohle nějak do Nette\Forms dostat? Nemusí to být aktivované pro všechny inputy, někomu se to třeba nemusí hodit; stačí, když se to bude aktivovat nějakou metodou nad inputem, u kterého chci trimování a mazání whitespace znaků dělat automaticky.

P. S. : Pokud už tam něco takového je, omlouvám se, a očekávám výsměch :).

EDIT: Zkoušel jsem to ještě jednou a zdá se, že trim se dělá, ale vyházení těch whitespace znaků se bohužel neděje :(.

Editoval m0t3jl (21. 7. 2009 23:14)

Patrik Votoček
Člen | 2221
+
0
-

Jsem pro…
Mimochodem (je pokročilejši noční hodina tak prosím nekamenovat) je pomlčka/spojovník taky whitespace (např. ICQ). Ale dělal bych to s nějákým zapínátkem nebo napsat si na to vlastní validátor ((My)Form::WSFLOAT / (My)Form::WSNUMBER)

Petr Motejlek
Člen | 293
+
0
-

vrtak-cz napsal(a):

Jsem pro…
Mimochodem (je pokročilejši noční hodina tak prosím nekamenovat) je pomlčka/spojovník taky whitespace (např. ICQ). Ale dělal bych to s nějákým zapínátkem nebo napsat si na to vlastní validátor ((My)Form::WSFLOAT / (My)Form::WSNUMBER)

Super, na to jsem si vůbec nevzpomněl. Myslím, že by to klidně mohlo vyhazovat jak běžné white space (mezera, atd.) i ty ‐, – a —. Je fakt, že zrovna u toho ICQ se to používá. Mě osobně by taky nevadilo, kdyby se vyhazovaly tyhle paznaky.

Docela to i vypadá, že by se hodilo, kdyby Nette\Forms měli možnost nastavení předzpracování argumentů (v našem případě trim, whitespace znaků, ‐, – a — ;).

Třeba rozhýbeme Davida, aby v tomto podnikl nějaké kroky :D

Editoval m0t3jl (22. 7. 2009 9:33)

PetrP
Člen | 587
+
0
-

Jsem pro, napadá mě ještě tecky mezi tisíci 1.000.000
a co římské čísla?

Petr Motejlek
Člen | 293
+
0
-

PetrP napsal(a):

Jsem pro, napadá mě ještě tecky mezi tisíci 1.000.000
a co římské čísla?

To je otázka ;). Co je potom takové číslo typu 1.000 ? Je to jeden tisíc, nebo to je jedna celá nula nula nula :D. Původně me to nenapadlo, ale docela by to chtělo, aby Nette\Forms zohledňoval nastavené locales při detekci čísel: tzn. neměl by např. Čechovi dovolit vstup pro číslo ve formě „1,000.2“ (což je pro en správně jeden tisíc a dvě desetiny), a zároveň Angličanovi by neměl dovolit vstup pro číslo ve formě „1 000,2“ (což je por cs správně jedna a dvě desetiny).

Zajímavá myšlenka, teď je na čase implementace :D. Myslím ale, že by se to docela hodilo.

PetrP
Člen | 587
+
0
-

m0t3jl napsal(a):

To je otázka ;). Co je potom takové číslo typu 1.000 ? Je to jeden tisíc, nebo to je jedna celá nula nula nula :D.

V případě že Form::INTEGER tak je to tisic.

U Form::FLOAT to asi musi bejt 1
ale 1.000.000 uz je milion
a 1.000,50 je taky čitelné

Původně me to nenapadlo, ale docela by to chtělo, aby Nette\Forms zohledňoval nastavené locales při detekci čísel: tzn. neměl by např. Čechovi dovolit vstup pro číslo ve formě „1,000.2“ (což je pro en správně jeden tisíc a dvě desetiny), a zároveň Angličanovi by neměl dovolit vstup pro číslo ve formě „1 000,2“ (což je por cs správně jedna a dvě desetiny).

David se snaží vyhnout zohledňování jazyků, takže by to asi neprošlo.

Ono spíš to vydím, že až přijde davit tak celou tuhle diskuzi utne dvěma slovama. ;]

Petr Motejlek
Člen | 293
+
0
-

PetrP napsal(a):

m0t3jl napsal(a):

To je otázka ;). Co je potom takové číslo typu 1.000 ? Je to jeden tisíc, nebo to je jedna celá nula nula nula :D.

V případě že Form::INTEGER tak je to tisic.

U Form::FLOAT to asi musi bejt 1
ale 1.000.000 uz je milion
a 1.000,50 je taky čitelné

Původně me to nenapadlo, ale docela by to chtělo, aby Nette\Forms zohledňoval nastavené locales při detekci čísel: tzn. neměl by např. Čechovi dovolit vstup pro číslo ve formě „1,000.2“ (což je pro en správně jeden tisíc a dvě desetiny), a zároveň Angličanovi by neměl dovolit vstup pro číslo ve formě „1 000,2“ (což je por cs správně jedna a dvě desetiny).

David se snaží vyhnout zohledňování jazyků, takže by to asi neprošlo.

Ono spíš to vydím, že až přijde davit tak celou tuhle diskuzi utne dvěma slovama. ;]

Proč by to u Form::FLOAT MUSELA být 1? Form::FLOAT pouze říká, že číslo má i desetinnou část. Myslím, že zrovna u tohoto je zohledňování prostředí NUTNOST. Pokud si někdo nastaví v prohlížeči, nebo někde na úrovni aplikace, že vstup a výstup chce pokud možno v cs_CZ, tak mu musím umožnit psát česky formátovaná čísla a zároveň ho musím pokárat za paskvily typu 1,002.1 — to přece není česky a nikdo to za český tvar čísla nemůže chtít prohlásit. Pro anglický text platí to samé — tam přeci nemůže být správně napsat 1 002,1 a předpokládát, že to stroj na druhé straně správně vyhodnotí jako anglické číslo ;).

jasir
Člen | 746
+
0
-

Já jsem se o něco podobného pokoušel, ale pak se mi to moc nelíbilo. Nakonec jsem šel cestou validace a manuální úpravy vstupů / výstupů při vytváření / onSubmit.

h4kuna
Backer | 740
+
0
-

Zdravim nez jsem poznal nette mel jsem napsany vlastni form script a moje koncepce byla:

1)rozdeleni zakladnich datovych typu coz v nette taky najdem
* string
* int
* float
* bool
* files
* date
* datetime
* time

2)validacni prvky
* obligate (povinne)
* text =array(neformatovany, bez html, pouze znaky abecedy, abeceda + cisla, abeceda + mezera, abeceda + mezera + cisla)
* psc
* icq (udrztuje format xxx-xxx-xxx)
* telephone (udrztuje format xxx-xxx-xxx)
* min (minimalni poce znaku)
* max
* ucfirst
* text2int (pomoci regularu odstrani vse mimo cislic) treba pro telefon nebo pcs a pak to formatuje viz vyse
* email
* datum

3)toto jsou veci ktere najdete ve vetsine formularu a abych to nemusel pokazdy kombinovat tak mam skupiny validacnich prvku
‚name‘ =>array(typ=>‚string‘, min=>2, max=>30, small=>1, ucfirst=>1, text=>2) prijmeni je stejny jako jmeno na validaci, rika typ string, minimalne 2 znaky, maximalne 30, prvni si sam upravi na velke, pouze znaky abecedy
‚town‘ =>array(typ=>‚string‘, min=>2, max=>50, ucfirst=>1, text=>1),
‚street‘ =>array(typ=>‚string‘, min=>2, max=>50, ucfirst=>1, text=>3),//spolecnost stejny jako ulice
‚psc‘ =>array(typ=>‚int‘, min=>5, max=>5, text2int=>1, psc=>1),
‚icq‘ =>array(typ=>‚int‘, min=>7, max=>9, text2int=>1, icq=>1),
‚telefon‘ =>array(typ=>‚int‘, min=>9, max=>12,text2int=>1, telefon=>1),
‚nick‘ =>array(typ=>‚string‘, min=>4, max=>25, text=>3),
‚skype‘ =>array(typ=>‚string‘, min=>6, max=>25, text=>3),
‚password‘ =>array(typ=>‚string‘, min=>6, max=>20, text=>4),
‚email‘ =>array(typ=>‚string‘, min=>6, max=>100, small=>1, email=>1),
‚text‘ =>array(typ=>‚string‘, min=>1, textSpecial=>1),

Myslim si ze by bylo dobry udelat nejaky takovyto skupiny pro nette

<?php
$form->addText('jmeno')->validace('name');//proste se jenom odkazovat na bod 3)
$form->addText('prijmeni')->validace('name');
?>

a tim by bylo hotovo

Podotykam ze jsem 3) bod zkopiroval z kodu a body 1) a 2) opsal tudiz nemusi uplne sedet indexy mimo ‚name‘ jinak myslenka by mela byt zachycena.

Editoval matata (22. 7. 2009 13:08)

Petr Motejlek
Člen | 293
+
0
-

matata napsal(a):

Zdravim nez jsem poznal nette mel jsem napsany vlastni form script a moje koncepce byla:

1)rozdeleni zakladnich datovych typu coz v nette taky najdem
* string
* int
* float
* bool
* files
* date
* datetime
* time

2)validacni prvky
* obligate (povinne)
* text =array(neformatovany, bez html, pouze znaky abecedy, abeceda + cisla, abeceda + mezera, abeceda + mezera + cisla)
* psc
* icq (udrztuje format xxx-xxx-xxx)
* telephone (udrztuje format xxx-xxx-xxx)
* min (minimalni poce znaku)
* max
* ucfirst
* text2int (pomoci regularu odstrani vse mimo cislic) treba pro telefon nebo pcs a pak to formatuje viz vyse
* email
* datum

3)toto jsou veci ktere najdete ve vetsine formularu a abych to nemusel pokazdy kombinovat tak mam skupiny validacnich prvku
‚name‘ =>array(typ=>‚string‘, min=>2, max=>30, small=>1, ucfirst=>1, text=>2) prijmeni je stejny jako jmeno na validaci, rika typ string, minimalne 2 znaky, maximalne 30, prvni si sam upravi na velke, pouze znaky abecedy
‚town‘ =>array(typ=>‚string‘, min=>2, max=>50, ucfirst=>1, text=>1),
‚street‘ =>array(typ=>‚string‘, min=>2, max=>50, ucfirst=>1, text=>3),//spolecnost stejny jako ulice
‚psc‘ =>array(typ=>‚int‘, min=>5, max=>5, text2int=>1, psc=>1),
‚icq‘ =>array(typ=>‚int‘, min=>7, max=>9, text2int=>1, icq=>1),
‚telefon‘ =>array(typ=>‚int‘, min=>9, max=>12,text2int=>1, telefon=>1),
‚nick‘ =>array(typ=>‚string‘, min=>4, max=>25, text=>3),
‚skype‘ =>array(typ=>‚string‘, min=>6, max=>25, text=>3),
‚password‘ =>array(typ=>‚string‘, min=>6, max=>20, text=>4),
‚email‘ =>array(typ=>‚string‘, min=>6, max=>100, small=>1, email=>1),
‚text‘ =>array(typ=>‚string‘, min=>1, textSpecial=>1),

Myslim si ze by bylo dobry udelat nejaky takovyto skupiny pro nette

<?php
$form->addText('jmeno')->validace('name');//proste se jenom odkazovat na bod 3)
$form->addText('prijmeni')->validace('name');
?>

a tim by bylo hotovo

Podotykam ze jsem 3) bod zkopiroval z kodu a body 1) a 2) opsal tudiz nemusi uplne sedet indexy mimo ‚name‘ jinak myslenka by mela byt zachycena.

S tím telefonním číslem by jsi umřel. Některý země mají míň / víc čísel ;). Ale jako český to stačí bohatě :D

Ondřej Brejla
Člen | 746
+
0
-

Šmajra, když odpovídám na celý předcházející post, tak ho celý necituji…zvlášť, když je takhle dlouhej, kdo to má scrollovat ;-)

h4kuna
Backer | 740
+
0
-

m0t3jl napsal(a):

S tím telefonním číslem by jsi umřel. Některý země mají míň / víc čísel ;). Ale jako český to stačí bohatě :D

Neber to do slova :) tam slo o to seskupeni validaci minimalne se stale opakuje nick, jmeno, prijmeni, mesto, ulice s popisnym cislem a to ma stale stejny pravidla a pokud vim telefoni cisla by meli mit minimalne devet cisel plus predvolacka statu a tady to neni uvedene ale i to je osetrene

Patrik Votoček
Člen | 2221
+
0
-

Ještě mě napadlo u té pomlčky se musí hlídat jestli to není první znak (např. –200) aby to nebylo pak bráno jako +200… :-)

Jinak co se týká teček a čárek mezi čísly tak to bych řešil pouze u INTegeru kde je to jedno…

Editoval vrtak-cz (22. 7. 2009 18:19)

Petr Motejlek
Člen | 293
+
0
-

vrtak-cz napsal(a):

Ještě mě napadlo u té pomlčky se musí hlídat jestli to není první znak (např. –200) aby to nebylo pak bráno jako +200… :-)

Jinak co se týká teček a čárek mezi čísly tak to bych řešil pouze u INTegeru kde je to jedno…

No uvidíme, jak se k tomu vyjádří David.

na1k
Člen | 288
+
0
-

No a nestačí si na ty telefonní, icq a jiné čísla jednoduše napsat callback? Pokud čtu kód správně, tak to callbacky baští.

A u obyčejných čísel bych se přikláněl ke striktnímu výkladu, tedy že „1 200“ není číslo. Tak jako tak ale stejně zůstává otázka, jaké hodnoty vracet. Zdrojáky jsem nezkoumal, ale zřejmě tam bude nějaká funkce, která hodnotu z políčka přinejmenším přetypuje na požadovaný (a validovaný) typ. Jak to ale může fungovat bez zohlednění locale?

Editoval na1k (22. 7. 2009 20:33)

Petr Motejlek
Člen | 293
+
0
-

na1k napsal(a):

No a nestačí si na ty telefonní, icq a jiné čísla jednoduše napsat callback? Pokud čtu kód správně, tak to callbacky baští.

A u obyčejných čísel bych se přikláněl ke striktnímu výkladu, tedy že „1 200“ není číslo. Tak jako tak ale stejně zůstává otázka, jaké hodnoty vracet. Zdrojáky jsem nezkoumal, ale zřejmě tam bude nějaká funkce, která hodnotu z políčka přinejmenším přetypuje na požadovaný (a validovaný) typ. Jak to ale může fungovat bez zohlednění locale?

Že by to nezohledňovalo locale si nemyslím. Co jsem si kdysi zkoušel, tak PHP je schopné například při echo $cislo, kde číslo je nějaký float, vyhodit to číslo formátované podle locales (tady se bavíme jen o tečce/čárce jako desetinném oddělovačí, třeba ty české mezery jako oddělovače tisíců locales nezná). Na vstupu ale jako číslo potřebuje anglický formát – tedy číslo 1,2 zpracuje jako 1 ;).