Αριθμοί Κυκλοφορίας

Μια απλή κλάση που τροποποιεί τους αριθμούς κυκλοφορίας ώστε να μείνουν μόνο οι επιτρεπτοί χαρακτήρες για τους αριθμούς κυκλοφορίας στις ελληνικές πινακίδες. Οι ελληνικοί χαρακτήρες που δεν υπάρχουν στο λατινικό αλφάβητο αφαιρούνται, και όσοι μένουν μετατρέπονται στον αντίστοιχο (οπτικά) λατινικό χαρακτήρα.
Οι λατινικοί μένουν όπως είναι, αφού αφορούν πινακίδες ξένων κρατών.
Αν τώρα υπάρχουν πινακίδες με αραβικά γράμματα, ταϊλανδέζικα, κινέζικα, κ.λπ. δεν έχω δει, οπότε κάνουμε τον κινέζο. 🙂

    public class Plates
    {
        protected static readonly string alternateWildcards = "*?";
        protected static readonly string validWildcards = "%_^[]-";

        protected static readonly string validChars = "ΑΒΕΖΗΙΚΜΝΟΡΤΥΧΆΈΊΌΪABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890/";
        protected static string charGR = "ΑΒΕΖΗΙΚΜΝΟΡΤΥΧΆΈΊΌΪ";
        protected static char[] charUS = "ABEZHIKMNOPTYXAEIOI".ToCharArray();

        public static string Normalize(string platesNo)
        {
            return Normalize(platesNo, false);
        }

        public static string Normalize(string platesNo, bool allowWildcards)
        {
            string allowChars;
            if (allowWildcards)
            {
                allowChars = validWildcards + validChars;
                //Replace alternate wildcards with normal wildcards
                // * -> %
                // ? -> _
                for (int i = 0; i < alternateWildcards.Length; i++)
                {
                    platesNo = platesNo.Replace(alternateWildcards[i],
                                                validWildcards[i]);
                }
            }
            else
            {
                allowChars = validChars;
            }
            StringBuilder sb = new StringBuilder();
            int start = 0;
            char[] chPlatesNo = platesNo.ToUpperInvariant().ToCharArray();
            foreach (char ch in chPlatesNo)
            {
                if (allowChars.IndexOf(ch, start) >= start)
                {
                    int x = charGR.IndexOf(ch);
                    if (x >= 0)
                    {
                        sb.Append(charUS[x]);
                    }
                    else
                    {
                        sb.Append(ch);
                    }
                }
            }
            return sb.ToString();
        }
    }