Ékezetes betűk kiszűrése egy textboxból C#
2020-11-20T19:38:27+01:00
2020-11-22T00:28:54+01:00
2022-08-11T23:10:31+02:00
Viktorka73
Sziasztok!

Adott egy winformos alkalmazás (c#, visual studio). Egy űrlap jellegű formon ügyfelek adatait lehet felvenni textboxokban, ms sql adatbázisban tárolva. Ellenőriztetni szeretnék egyes textboxokat:
1.
email cím megadásánál hogy ne lehessen ékezetes betűt bevinni (a kis betűt megoldottam)
2.
Név bevitelénél minden bevitt szónál változtassa át a kezdőbetűt nagybetűre gépelés közben

 tud esetleg segíteni valaki? köszönöm
Mutasd a teljes hozzászólást!
végül ezt a megoldást választottam az ékezetes karakterek cseréjéhez:

static char[] replacementArray = { 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o','o',
                                             'u', 'u', 'u', 'u','u', 't', 'y', 'y', 's', 'b', 'd', 'n', 'm', ' ', ' ', ' ', ' ', ' ' };

        static char[] accentsArray = { 'à', 'â', 'ä', 'æ', 'ã', 'á', 'å', 'ç', '©', 'é', 'è', 'ê', 'ë', 'î', 'ï', 'í', 'ì', 'ô', 'õ', 'œ', 'ò', 'ó', 'ö','ő', 'ø',
                                         'ù', 'ú', 'û', 'ü','ű', 'þ', 'ý', 'ÿ', '§', 'ß', 'ð', 'ñ', 'µ', '€', '£', '¥', '+', '•' };


        public static string RemoveDiacritics(string accentedStr)
        {
            char[] replacement = replacementArray;
            char[] accents = accentsArray;
            string temp = new string(replacement).ToUpper();
            char[] upperReplacement = temp.ToCharArray();
            temp = new string(accents).ToUpper();
            char[] upperAccents = temp.ToCharArray();

            StringBuilder returnString = new StringBuilder();

            if (accents != null && replacement != null && accentedStr.IndexOfAny(accents) > -1)
            {
                returnString.Length = 0;
                returnString.Append(accentedStr);
                for (int i = 0; i < accents.Length; i++)
                {
                    returnString.Replace(accents, replacement);
                }

                return returnString.ToString();
            }
            else if (accents != null && replacement != null && accentedStr.IndexOfAny(upperAccents) > -1)
            {
                returnString.Length = 0;
                returnString.Append(accentedStr);
                for (int i = 0; i < upperAccents.Length; i++)
                {
                    returnString.Replace(upperAccents, upperReplacement);
                }

                return returnString.ToString();
            }
            else
                return accentedStr;
        }



        private void tb_tagemail_TextChanged(object sender, EventArgs e)
        {
            int cursorPosition = this.tb_tagemail.SelectionStart;
            this.tb_tagemail.Text = RemoveDiacritics(this.tb_tagemail.Text);
            this.tb_tagemail.SelectionStart = cursorPosition;
        }

ez tökéletesen működik...
azért köszönöm...
Mutasd a teljes hozzászólást!

  • Szia Viktorka73!

    Minden karakternek van ANSI kódja - az ékezetes betűknek is ...
    Az ékezet nélkülieknek A-tól Z-ig 65-től 90-ig, a-tól z-ig 97-től 122-ig.
    Szerintem a többit már megoldod.

    üdvözlettel
    verax
    Mutasd a teljes hozzászólást!
  • Hali!

    Mutasd – forráskóddal/-részlettel –, hogy eddig mivel, hogyan próbálkoztál, meddig jutottál el, mi nem megy, miben/hol akadtál el!

    Mutasd a teljes hozzászólást!
  • private void tb_tagnev_TextChanged(object sender, EventArgs e)
            {
                if (tb_tagnev.Text.Length <= 0) return;
                string s = tb_tagnev.Text.Substring(0, 1);
                if (s != s.ToUpper())
                {
                    int curSelStart = tb_tagnev.SelectionStart;
                    int curSelLength = tb_tagnev.SelectionLength;
                    tb_tagnev.SelectionStart = 0;
                    tb_tagnev.SelectionLength = 1;
                    tb_tagnev.SelectedText = s.ToUpper();
                    tb_tagnev.SelectionStart = curSelStart;
                    tb_tagnev.SelectionLength = curSelLength;
                }
            }

    Ezzel az eseménnyel az első karakter lesz nagy betű a beirt szóban. Nekem az összes begépelt szó nagybetűvel kellene. A kisbetűket ToLowerrel oldottam meg.
    Az ékezetes betűk kiszűrésére egyenlőre nincs ötletem.

    köszönöm
    Mutasd a teljes hozzászólást!
  • if (tb_tagnev.Text.Length <= 0) return;
    nos, egy halmazban nem lehet kevesebb, mint nulla elem. 

    készíts egy szólistát, elemeinek kezdőbetűit varázsold át nagybetűssé, majd elemeit tedd vissza oda, ahonnan kivetted.

    szavak betűin iterálj és ha adott betű ellenőrzésekor kiderül, hogy nem megfelelő, akkor járj el a kívánalmak szerint: hibaüzenet, vagy csere - amit épp akarsz.
    Mutasd a teljes hozzászólást!
  • private void tb_tagnev_TextChanged(object sender, EventArgs e)
            {
                tb_tagnev.Text = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(this.tb_tagnev.Text);
                tb_tagnev.Select(tb_tagnev.Text.Length, 0);
            }

    én pl egy ilyen egyszerű megoldásra gondoltam, a Youtube-on találtam...
    Ez a kódrész az összes begépelt szó kezdőbetűjét nagybetűre cseréli....
    azért köszi a segítséget...
    Mutasd a teljes hozzászólást!
  • Szia Viktorka73!

    1.
    Mit nyersz azzal, hogy megvizsgálod: s != s.ToUpper()
    Mi van akkor, ha a felhasználó nagybetűt használt? És mi van akkor, ha kisbetűt?
    Mi értelme van firtatni a kérdést?
    Aminek nagybetűsnek kell lennie (például szóköz és kötőjel után) az legyen nagybetűs!
    ... =  s.ToUpper()
    Nincs kérdés, csak értékadás.

    2.
    Az ékezetes betűket egy többágú elagázásban (Switch) ki tudod cserélni a megfelelő ékezet nélküli betűkre. A textbox elhagyásakor betűről betűre végig nézed a beírt szöveget, és ahol a soron következő kiolvasott karakter ansi kódja kívül esik a 97-től 122-ig tartományon vagy az email címben megengedett karakterek listáján (kukac: 64, pont: 46, alulvonás: 95, kötőjel: 45), ott cserélsz a Switch használatával. Hasonlóan járhatsz el a nagybetűk esetén. Ha a karakter kódja a 65-től 90-ig tartó tartományba esik:  kód=kód+32. (példa:"B"=66 , 66+32=98, 98="b") ... vagy ha neked jobban tetszik: .ToLower

    üdvözlettel
    verax
    Mutasd a teljes hozzászólást!
  • végül ezt a megoldást választottam az ékezetes karakterek cseréjéhez:

    static char[] replacementArray = { 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o','o',
                                                 'u', 'u', 'u', 'u','u', 't', 'y', 'y', 's', 'b', 'd', 'n', 'm', ' ', ' ', ' ', ' ', ' ' };

            static char[] accentsArray = { 'à', 'â', 'ä', 'æ', 'ã', 'á', 'å', 'ç', '©', 'é', 'è', 'ê', 'ë', 'î', 'ï', 'í', 'ì', 'ô', 'õ', 'œ', 'ò', 'ó', 'ö','ő', 'ø',
                                             'ù', 'ú', 'û', 'ü','ű', 'þ', 'ý', 'ÿ', '§', 'ß', 'ð', 'ñ', 'µ', '€', '£', '¥', '+', '•' };


            public static string RemoveDiacritics(string accentedStr)
            {
                char[] replacement = replacementArray;
                char[] accents = accentsArray;
                string temp = new string(replacement).ToUpper();
                char[] upperReplacement = temp.ToCharArray();
                temp = new string(accents).ToUpper();
                char[] upperAccents = temp.ToCharArray();

                StringBuilder returnString = new StringBuilder();

                if (accents != null && replacement != null && accentedStr.IndexOfAny(accents) > -1)
                {
                    returnString.Length = 0;
                    returnString.Append(accentedStr);
                    for (int i = 0; i < accents.Length; i++)
                    {
                        returnString.Replace(accents, replacement);
                    }

                    return returnString.ToString();
                }
                else if (accents != null && replacement != null && accentedStr.IndexOfAny(upperAccents) > -1)
                {
                    returnString.Length = 0;
                    returnString.Append(accentedStr);
                    for (int i = 0; i < upperAccents.Length; i++)
                    {
                        returnString.Replace(upperAccents, upperReplacement);
                    }

                    return returnString.ToString();
                }
                else
                    return accentedStr;
            }



            private void tb_tagemail_TextChanged(object sender, EventArgs e)
            {
                int cursorPosition = this.tb_tagemail.SelectionStart;
                this.tb_tagemail.Text = RemoveDiacritics(this.tb_tagemail.Text);
                this.tb_tagemail.SelectionStart = cursorPosition;
            }

    ez tökéletesen működik...
    azért köszönöm...
    Mutasd a teljes hozzászólást!
  • itt egy egyszerűbb megoldás is:

    static string RemoveDiacritics(string text)
            {
                var normalizedString = text.Normalize(NormalizationForm.FormD);
                var stringBuilder = new StringBuilder();

                foreach (var c in normalizedString)
                {
                    var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
                    if (unicodeCategory != UnicodeCategory.NonSpacingMark)
                    {
                        stringBuilder.Append(c);
                    }
                }

                return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
            }



            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                int cursorPosition = this.textBox1.SelectionStart;
                this.textBox1.Text = RemoveDiacritics(this.textBox1.Text);
                this.textBox1.SelectionStart = cursorPosition;
            }
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd