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
#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 :))
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ší.
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 :/
#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");
}
}
}
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
#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.
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku