Zawsze posiadam ten sam problem, kiedy chodzi o filtrowanie wprowadzanych danych. Ostatnio pisalem mala symulacje banku i zeby nie zasmiecac glownego kodu stowrzylem klase Czytacz do wczytywania i filtrowania danych.. Zamieszcze tu fragment kodu i mam nadzieje, ze ktos bedzie potrafil odpowiedziec mi na pytanie czy da sie to jakos prosciej zrealizowac...
Wspomne jeszcze, ze probowalem uzyc klas generycznych, zeby nie duplikowac metod dla Int i Dobule np. , ale potrzebuje w nich operatorow porownania, ktorych c# zabrania w szablonach, wiec nie wiem juz co poczac..
Kod:
class Czytacz
{
public static int Int(int dol, int gora)
{
int x = 0;
string tmp = "";
do
{
try { tmp = Poprawny("int"); }
catch (ZlyNapisException n) { Console.WriteLine("Uzyto niedozwolonych znakow w: '" + n.getNapis() + "'"); }
x = int.Parse(tmp);
} while (!(dol <= x && x <= gora));
return x;
}
public static double Double(double dol, double gora)
{
double x = 0;
string tmp = "";
do
{
try { tmp = Poprawny("double"); }
catch (ZlyNapisException n) { Console.WriteLine("Uzyto niedozwolonych znakow w: '" + n.getNapis() + "'"); }
x = double.Parse(tmp);
} while (!(dol <= x && x <= gora));
return x;
}
private static string Poprawny(string np)
{
string str1 = Console.ReadLine();
string delim = "123456789abcdefghijklmnoprstuwxyząćęóśłżźń!@#$%^&*()_+{}[]\"\';.>,</?|\\+=-_~` ";
if (np == "string")
{ delim = "123456789!@#$%^&*()_+{}[]\"\';.>,</?|\\+=-_~` "; }
else if (np == "int")
{ delim = "abcdefghijklmnoprstuwxyząćęóśłżźń!@#$%^&*()_+{}[]\"\';.>,</?|\\+=-_~` "; }
else if (np == "double")
{ delim = "abcdefghijklmnoprstuwxyząćęóśłżźń!@#$%^&*()_+{}[]\"\';.></?|\\+=-_~` "; }
string str2 = str1.Trim(delim.ToCharArray());
if (str1 != str2)
throw new ZlyNapisException(str1);
return str1;
}
public static string String()
{
string napis = "";
while (napis == "")
{
try { napis = Poprawny("string"); }
catch (ZlyNapisException n) { Console.WriteLine("Uzyto niedozwolonych znakow w: '" + n.getNapis() + "'"); }
}
return napis;
}
public static string Pesel()
{
string napis = "";
while (napis == "" || (napis.Length != 11))
{
try { napis = Poprawny("int"); }
catch (ZlyNapisException n) { Console.WriteLine("Uzyto niedozwolonych znakow w: '" + n.getNapis() + "'"); }
}
return napis;
}
}
A tutaj fragment z przykladowym uzyciem:
switch (x)
{
case 1:
Console.WriteLine("Podaj imie, nazwiso oraz pesel\n");
bank.DodajKlienta(Czytacz.String(), Czytacz.String(), Czytacz.Pesel());
break;
case 2:
Console.WriteLine("Podaj id klienta, ktorego chcesz usunac:\n");
bank.UsunKlienta(Czytacz.Int(0, 999999999));
break;
Prosze zwrocic uwage jeszcze na aspekt, ze w case 2: uzywam wczytywania inta ktory moze byc praktycznie dowolnie wielki, bo nie wiadomo jak duza jest baza klientow, stad gdybym chcial znowu zrobic oddzielna metode dla inta bez parametrow, to by bylo juz tak zasmiecone i duplikowane ze golwa mala..