C# :: Aufgabe #205
2 Lösungen
Postleitzahl validieren
Anfänger - C#
von syneex
- 14.05.2018 um 10:26 Uhr
Hallo,
mithilfe von regulären Ausdrücken soll eine deutsche Postleitzahl validiert werden.
Setzen Sie dies wahlweise in einer GUI oder der Konsole um.
Zum Ausprobieren:
- Postleitzahl anderer Länder validieren.
- Ausgabe um welches Land es sich dabei handelt.
mithilfe von regulären Ausdrücken soll eine deutsche Postleitzahl validiert werden.
Setzen Sie dies wahlweise in einer GUI oder der Konsole um.
Zum Ausprobieren:
- Postleitzahl anderer Länder validieren.
- Ausgabe um welches Land es sich dabei handelt.
Lösungen:
Ich habe hier jetzt zwei Validierungsmöglichkeiten:
Einmal in der Klasse SimpleZipCodeValidation wird ein regulärer Ausdruck genutzt zur Validierung. Für eine deutsche PLZ gilt 5 Zeichen und nur Ziffern, dies trifft aber auch auf spanische und finnische PLZs zu. Gibt man bspw. 28001 ein, würde das als deutsche PLZ validiert werden, obwohl es die PLZ von Madrid ist.
Deshalb habe ich noch eine weitere Validierung mithilfe des Webservice http://api.zippopotam.us in der Klasse WebserviceZipCodeValidation erstellt.
Einmal in der Klasse SimpleZipCodeValidation wird ein regulärer Ausdruck genutzt zur Validierung. Für eine deutsche PLZ gilt 5 Zeichen und nur Ziffern, dies trifft aber auch auf spanische und finnische PLZs zu. Gibt man bspw. 28001 ein, würde das als deutsche PLZ validiert werden, obwohl es die PLZ von Madrid ist.
Deshalb habe ich noch eine weitere Validierung mithilfe des Webservice http://api.zippopotam.us in der Klasse WebserviceZipCodeValidation erstellt.
C#-Code
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Web.Script.Serialization;//benötigt Verweis auf System.Web.Extensions namespace ConsoleZipCodeValidation { class Program { static void Main(string[] args) { Console.Write("Geben Sie eine deutsche PLZ ein: "); string plz = Console.ReadLine(); //Mit Webservice Console.Write("In welchen Ländern soll gesucht werden? (durch Komma trennen): "); string[] searchIn = Console.ReadLine().Split(','); var foundCities = WebserviceZipCodeValidation.ValidateZipCode(plz, searchIn); if (foundCities.Count() == 0) { Console.WriteLine("Die PLZ konnte nicht gefunden werden"); } else { Console.WriteLine("Folgende Treffer gefunden:"); foreach (var city in foundCities) { Console.WriteLine(city); } } // //Mit Regex //if (SimpleZipCodeValidation.IsGermanZipCode(plz)) //{ // Console.WriteLine("Die eingebene PLZ ist eine deutsche PLZ"); //} //else //{ // Console.WriteLine("Die eingebene PLZ ist keine deutsche PLZ"); //} Console.ReadLine(); } } static class SimpleZipCodeValidation { const string onlyNumbers = "^[0-9]+$"; public static bool IsGermanZipCode(string zipCode) { return zipCode.Length == 5 && Regex.IsMatch(zipCode, onlyNumbers); } } class WebserviceZipCodeValidation { const string webserviceUrl = "http://api.zippopotam.us/{0}/{1}";//0 = Landkennung (de, at, ch, ...), 1 = PLZ public static IEnumerable<City> ValidateZipCode(string zipCode, params string[] searchInCountrys) { foreach (string s in searchInCountrys) { string city, country; if (ValidateZipCode(zipCode, out country, out city, s)) { yield return new City() { Cityname = city, Country = country, ZipCode = zipCode }; } } } public static bool ValidateZipCode(string zipCode, out string country, out string city, string searchInCountry) { try { WebClient client = new WebClient(); string url = CreateRequestString(searchInCountry, zipCode); string json = Encoding.UTF8.GetString(client.DownloadData(url)); Dictionary<string, object> filters = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(json); country = filters["country"].ToString(); object[] places = ((ArrayList)filters["places"]).ToArray(); if (places.Length == 1) { Dictionary<string, object> placesDic = (Dictionary<string, object>)places[0]; city = placesDic["place name"].ToString(); return true; } else { country = ""; city = ""; return false; } } catch (Exception) { country = ""; city = ""; return false; } } static string CreateRequestString(string country, string zipCode) { return string.Format(webserviceUrl, country, zipCode); } } class City { public string Cityname { get; set; } public string Country { get; set; } public string ZipCode { get; set; } public override string ToString() { return $"{ZipCode} {Cityname}, {Country}"; } } }
C#-Code
using System; using System.Text.RegularExpressions; namespace RegexPlzValidator { class Program { static void Main(string[] args) { if (args.Length == 1) { string isPlzValide = (validatePlz(args[0]) ? "valide" : "nicht valide."); Console.WriteLine("Die eingegebene PLZ \"{0}\" ist {1}.", args[0], isPlzValide); } else { Console.WriteLine("Parameter fehler:\nBitte einen einzigen Parameter als PLZ uebergeben."); } Console.ReadKey(); } private static bool validatePlz(string plz) { return new Regex("^[0-9]{5}$").IsMatch(plz); } } }