C# :: Aufgabe #205

2 Lösungen Lösungen öffentlich

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.

Lösungen:

vote_ok
von daniel59 (4260 Punkte) - 15.05.2018 um 09:39 Uhr
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.

Quellcode ausblenden 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}";
        }
    }
}
vote_ok
von Exception (7090 Punkte) - 18.05.2018 um 15:07 Uhr
Quellcode ausblenden 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);
        }
    }
}

1810778

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.