Validacia stringu – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Validacia stringu – .NET – Fórum – Programujte.comValidacia stringu – .NET – Fórum – Programujte.com

 

Anny
~ Anonymní uživatel
7 příspěvků
19. 6. 2012   #1
-
0
-

Ahojte,

Je mozne nejak validaovat string na DateTime v pozadovanom formate ? Stretla som sa s DateTime.TryParse(), ale ten toho pusti viac nez by som chcela. Dakujem

Nahlásit jako SPAM
IP: 89.173.138.–
Chrasty
~ Redaktor
+4
Posthunter
19. 6. 2012   #2
-
+1
-
Zajímavé

#1 Anny
Ahoj,

nerozumím formulaci "validovat string na DateTime". DateTime.TryParse() (jak už název napovídá) se pokouší převést string na DateTime, pokud se mu to podaří, vrací true a out DateTime, pokud ne, vrací false.

Jinak existuje verze DateTime.TryParse(), která přijímá i argument typu IFormatProvider, což je informace, podle které se datum naformátuje. Můžeš té metodě třeba předat instanci CultureInfo a získat tak český, americký, nebo jakýkoliv jiný formát data. Více viz http://msdn.microsoft.com/en-us/library/9h21f14e.aspx

Pokud chceš skutečně validovat, budeš potřebovat regulární výrazy (příspěvek pode mnou :))

Nahlásit jako SPAM
IP: 193.179.196.–
certeon0
Newbie
19. 6. 2012   #3
-
+1
-
Zajímavé

Obecně se na validaci textu používá regulérních výrazů.

Zde je popsáno použití v .net:

http://www.vbnet.cz/…y_v_net.aspx

Pokud se však snažíte konkrétně o to, co popisuje Chrasty, tak je jeho řešení čistější.

Nahlásit jako SPAM
IP: 109.71.213.–
Anny
~ Anonymní uživatel
7 příspěvků
20. 6. 2012   #4
-
0
-

Dakujem,

no ano, napisala som to hlupo. TryParse sa pokusa konvertovat string na DateTime a pokial sa mu to podari, vrati true. Ja som to chcela tak, ze pri tom pokuse zaroven aj skontroluje, ci je ten string v pozadovanom formate. RegExu sa zrejme nevyhnem :/

Nahlásit jako SPAM
IP: 89.173.138.–
Anny
~ Anonymní uživatel
7 příspěvků
20. 6. 2012   #5
-
0
-

#4 Anny
pozrela som na ten clanok na vbnet a v diskusii rozoberaju, ze prave na datum RegEx nie je najvhodnejsi. Na nete ale vidim len validovanie cez TryParse () :/

Nahlásit jako SPAM
IP: 89.173.138.–
certeon0
Newbie
20. 6. 2012   #6
-
0
-

#5 Anny
Netřeba klesat na duchu :)

Můžete upřesnit nějakou konkrétní věc, co TryParse() považuje za validní a vy chcete, aby to vyhodnotil za chybné?

Jinak obecně je pro Vás důležité to, že můžete obě metody kombinovat.

Nejprve provedete TryParse(), které odfiltruje v Regexu těžko uchopitelné počty dnů v měsíci v závislosti s aktuálním kalendářem. Pak přidáte vlastní kontrolu pomocí Regulárního výrazu, která dodatečně zkontroluje Vámi požadované parametry. Pokud ani Regulérním výrazem není kontrola uchopitelná, tak můžete napsat vlastní metodu ověřující například, zda je datum starší než dnešní.

Ukázkový kód:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace Test_Datumu
{
    class Program
    {
        static void Main(string[] args)
        {
            string napsano = Console.ReadLine();

            DateTime datum;

            // Ověření přes TryParse
            if (DateTime.TryParse(napsano, out datum))
            {
                // Ověření přes Regulární výraz
                if (Regex.IsMatch(napsano, "Sem napiště vlastní regulérní výraz")))
                {
                    // Ověření vlastní metodou
                    if (JeBudoucimDatem(datum))
                    {
                        Spravne();
                    }
                    else
                    {
                        Spatne();
                    }
                }
                else
                {
                    Spatne();
                }
            }
            else
            {
                Spatne();
            }

            Console.ReadLine();
        }

        /// <summary>
        /// Vrátí True pouze tehdy, když datum v parametru ještě nenastal
        /// </summary>
        /// <param name="datum">Datum pro kontrolu</param>
        /// <returns>Vrací logickou hodnotu nabývající true tehdy, když je datum budoucí</returns>
        static bool JeBudoucimDatem(DateTime datum)
        {
            if (datum > DateTime.Now)
            {
                return true;
            }

            return false;
        }

        /// <summary>
        /// Metoda, která se spustí, pokud je datum správné
        /// </summary>
        static void Spravne()
        {
            Console.WriteLine("Datum prošel kontrolou.");
        }

        /// <summary>
        /// Metoda, která se spustí, pokud text neprojde kteroukoliv validační podmínkou
        /// </summary>
        static void Spatne()
        {
            Console.WriteLine("Text není datum ve správném formátu");
        }

        
    }
}
Nahlásit jako SPAM
IP: 109.71.213.–
Anny
~ Anonymní uživatel
7 příspěvků
21. 6. 2012   #7
-
0
-

No mojou ulohou je zistit, ci je napr toto 01012012 validny datum  

Nahlásit jako SPAM
IP: 212.89.227.–
certeon0
Newbie
29. 6. 2012   #8
-
0
-

#7 Anny
A chceš, aby to jako validní nepřijal? 

Pokud vyžaduješ striktně uvedené tečky, tak ověř pomocí regulárního výrazu

 [1-3]?[0-9]\.[01]?[0-9]\.[12][0-9]{3}

zda to sedí a pak to strč do DateTime.TryParse

Nahlásit jako SPAM
IP: 109.71.213.–
simas0
Newbie
30. 6. 2012   #9
-
0
-

Pokud budes vedet, ze datum prijde presne v tomto formátu, tak můžeš takto "hloupe":

string mojeStrDate = "01012012"

DateTime x;

try

{

x = new DateTime(ConvertToInt(mojeStrDate.Substring(4,4)),ConvertToInt(mojeStrDate.Substring(2,2)),ConvertToInt(mojeStrDate.Substring(0,2)));

}

catch (....)

{}

PS.: Pisu to z hlavy, tak snad je to syntakticky dobre

Nahlásit jako SPAM
IP: 193.165.10.–
certeon0
Newbie
30. 6. 2012   #10
-
0
-

#9 simas
S touto radou musím trochu nesouhlasit. 

Try Catch Finally se pro řízení běhu programu užívat nesmí. Vyvolání Catch má vysoké režijní náklady a je proto vhodný pouze pro zachycení skutečně chybového stavu. 

Sice se zde jedná jen o jeden průchod, ale jakmile si zvykneš takto "obcházet" skutečné řešení problému, tak si s tím zaplevelíš program a mimo pomalost máš na potíže zaděláno. 

I kdyby jsi zachytával v bloku catch určitý typ výjimky (třeba .InvalidCastException), tak se ti může stát, že některý z příkazů uvnitř bloku try bude vyvolávat tento typ výjimky i v jiných případech, než při této "validaci". Tvůj program to zpracuje jako nevalidní text a pohřbíš tak do aplikace chyby, které se velmi špatně hledají.

Řešení které uvádím nahoře je funkčně ekvivalentní a nenese s sebou tyto potíže.

Nahlásit jako SPAM
IP: 109.71.213.–
certeon0
Newbie
30. 6. 2012   #11
-
0
-

#9 simas


Také bys nikdy neměl brát jako podmínku to, že ti přijde řetězec v určitém formátu od uživatele, protože to nemůžeš zajistit. Tedy jednoduše ne.

Nahlásit jako SPAM
IP: 109.71.213.–
simas0
Newbie
30. 6. 2012   #12
-
0
-

#11 certeon
JJ, máš pravdu, většinou to takhle neřeším, ale jen jsem chtěl poukázat na to, že to lze i jinak bez regex

Nahlásit jako SPAM
IP: 193.165.10.–
certeon0
Newbie
30. 6. 2012   #13
-
0
-

#12 simas
V pohodě, ale programátorské peklo tě nemine. :D

Nahlásit jako SPAM
IP: 109.71.213.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Podobná vlákna

Validacia — založil funny

Validacia datumu — založil dalaman

Validacia XML cez XSD — založil eswes

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý