Avatar billede prec Nybegynder
21. oktober 2004 - 16:39 Der er 23 kommentarer og
1 løsning

Check om string er numerisk, alfabetisk osv

Jeg skal lave en lille funktion der checker om en string er numerisk, alfabetisk eller alfanumerisk.

Jeg kunne forestille mig at den bedste måde er ved hjælp af Regex, men jeg er ikke så skarp på det område.

Nogen forslag?
Avatar billede arne_v Ekspert
21. oktober 2004 - 16:41 #1
Du kan bruge regex.

Du kan prøve at parse og catche en exception.

Du kan lave en manuelt gennemløb af strengen.
Avatar billede arne_v Ekspert
21. oktober 2004 - 16:41 #2
Løsning 2:

    public static bool IsDigit(string s)
    {
        try
        {
            int tmp = int.Parse(s);
            return true;
        }
        catch(FormatException)
        {
            return false;
        }
    }
Avatar billede arne_v Ekspert
21. oktober 2004 - 16:44 #3
Løsning 1:

    private static Pattern p = Pattern.compile("
  • ?[0-9]+");
    private static boolean intCheck(String s) {
        return p.matcher(s).matches();
    }
Avatar billede arne_v Ekspert
21. oktober 2004 - 16:45 #4
En for løkke som løber strengen igennem og tester hver tegn behøver jeg vist ikke
vise.
Avatar billede prec Nybegynder
21. oktober 2004 - 19:53 #5
Hvad med check om den er alfabetisk eller alfanumerisk?
Og vil en for lykke ikke være rimelig sløvt hvis den ska checke ca. 10000 strings igennem som hver er på op til 50 karakterer.
Jeg tror en Regex vil være bedre, men som sagt har jeg ikke så meget styr på det emne, jeg har leget lidt med det, men kunne ikke finde en løsning der virkede.
Avatar billede prec Nybegynder
21. oktober 2004 - 19:55 #6
Jeg bør måske lige forklare hvorfor det er vigtigt at vide om det er numerisk, alfabetisk eller alfanumerisk.
Jeg er ved at lave en converter til EDIFACT data, i det data format er der strenge regler for hvordan data må være udformet, heriblandt skal der checkes om hver data streng består af numerisk, alfabetisk eller alfanumerisk data, og da det er en meget streng standard SKAL dette checkes.
Avatar billede arne_v Ekspert
21. oktober 2004 - 19:55 #7
Du kan være ret sikker på at regex er langsommere end din egen for løkke !
Avatar billede arne_v Ekspert
21. oktober 2004 - 19:56 #8
[0-9]+
[A-Za-z]+
[A-Za-z0-9]+

må vel være 3 gode regex udtryk
Avatar billede prec Nybegynder
21. oktober 2004 - 20:00 #9
[0-9]+ og [A-Za-z]+ vil begge være sande ved alfanumerisk, så de dutter ik helt, regex udtrykket ska på en måde udelukke alfabetiske tegn i strengen der checker om den er numerisk, og omvendt.
Avatar billede arne_v Ekspert
21. oktober 2004 - 20:03 #10
Nej.

[0-9]+ ville ikke matche en hel streng som indeholder bogstaver og tal
(men kan selvfølgelig godt matche en del af strengen).
Avatar billede prec Nybegynder
21. oktober 2004 - 20:12 #11
Følgende kode giver dette resultat:

Checking: 412132
String is numeric
String is alphanumeric
Checking: asdasdgfa
String is alphabetic
String is alphanumeric
Checking: asgagf134151
String is numeric
String is alphabetic
String is alphanumeric

---------------------------

using System;
using System.Text.RegularExpressions;

namespace regextest
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            RegExTester t = new RegExTester();
            t.CheckString("412132");
            t.CheckString("asdasdgfa");
            t.CheckString("asgagf134151");
            Console.ReadLine();
        }
    }

    public class RegExTester
    {
        public void CheckString(string s)
        {
            Console.WriteLine("Checking: " + s);
            if(Regex.IsMatch(s, "[0-9]+"))
                Console.WriteLine("String is numeric");

            if(Regex.IsMatch(s, "[a-zA-ZæÆøØåÅ]+"))
                Console.WriteLine("String is alphabetic");
           
            if(Regex.IsMatch(s, "[a-zA-ZæÆøØåÅ0-9]+"))
                Console.WriteLine("String is alphanumeric");
        }
    }
}
Avatar billede arne_v Ekspert
21. oktober 2004 - 20:20 #12
IsMatch tester kun om pattern findes i strengen ikke om den matcher hele strengen.

using System;
using System.Text.RegularExpressions;

namespace regextest
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            RegExTester t = new RegExTester();
            t.CheckString("412132");
            t.CheckString("asdasdgfa");
            t.CheckString("asgagf134151");
            Console.ReadLine();
        }
    }

    public class RegExTester
    {
        public void CheckString(string s)
        {
            Console.WriteLine("Checking: " + s);
            if(Regex.IsMatch(s, "^[0-9]+$"))
                Console.WriteLine("String is numeric");

            if(Regex.IsMatch(s, "^[a-zA-ZæÆøØåÅ]+$"))
                Console.WriteLine("String is alphabetic");
         
            if(Regex.IsMatch(s, "^[a-zA-ZæÆøØåÅ0-9]+$"))
                Console.WriteLine("String is alphanumeric");
        }
    }
}
Avatar billede arne_v Ekspert
21. oktober 2004 - 20:20 #13
Checking: 412132
String is numeric
String is alphanumeric
Checking: asdasdgfa
String is alphabetic
String is alphanumeric
Checking: asgagf134151
String is alphanumeric
Avatar billede arne_v Ekspert
21. oktober 2004 - 20:23 #14
Eller:

using System;
using System.Text.RegularExpressions;

namespace regextest
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            RegExTester t = new RegExTester();
            t.CheckString("412132");
            t.CheckString("asdasdgfa");
            t.CheckString("asgagf134151");
            Console.ReadLine();
        }
    }

    public class RegExTester
    {
        public void CheckString(string s)
        {
            Console.WriteLine("Checking: " + s);
            if(s.Equals(Regex.Match(s, "[0-9]+").Value))
                Console.WriteLine("String is numeric");

            if(s.Equals(Regex.Match(s, "[a-zA-ZæÆøØåÅ]+").Value))
                Console.WriteLine("String is alphabetic");
         
              if(s.Equals(Regex.Match(s, "[a-zA-ZæÆøØåÅ0-9]+").Value))
                Console.WriteLine("String is alphanumeric");
        }
    }
}
Avatar billede arne_v Ekspert
21. oktober 2004 - 20:23 #15
Checking: 412132
String is numeric
String is alphanumeric
Checking: asdasdgfa
String is alphabetic
String is alphanumeric
Checking: asgagf134151
String is alphanumeric
Avatar billede prec Nybegynder
21. oktober 2004 - 20:26 #16
okay, den sidste løsning funker vist, hvis jeg returner resultatet.
Men du mener altså ikke det er den løsning der vil kræve mindst af computeren?
Avatar billede arne_v Ekspert
21. oktober 2004 - 20:27 #17
Regular expressions laver en masse "behind the scene".

Det giver minimum af kode at vedligeholde.

Men du bør kunne skrive noget selv som er 2-10 gange hurtigere.
Avatar billede prec Nybegynder
21. oktober 2004 - 20:29 #18
har du et forslag til hvordan det kan opnås, skriv evt. svar på dette som et svar, så får du lidt point
Avatar billede arne_v Ekspert
21. oktober 2004 - 20:37 #19
Jeg kan sagtens lave en metod esom checker det.

Men giv mig lige en god halv times tid.

Hunden står og påstår det er tid for aften tur !
Avatar billede prec Nybegynder
21. oktober 2004 - 20:39 #20
hvad bilder den sig ind? :P
Avatar billede arne_v Ekspert
21. oktober 2004 - 21:10 #21
using System;
using System.Text.RegularExpressions;

enum StringType { NUMERIC, ALPHABETIC, ALPHANUMERIC, NONE };

class TestClass
{
    public static StringType Check1(string s)
    {
        if(Regex.IsMatch(s, "^[0-9]+$"))
        {
            return StringType.NUMERIC;
        }
        else if(Regex.IsMatch(s, "^[a-zA-ZæÆøØåÅ]+$"))
        {
            return StringType.ALPHABETIC;
        }
        else if(Regex.IsMatch(s, "^[a-zA-ZæÆøØåÅ0-9]+$"))
        {
            return StringType.ALPHANUMERIC;
        }
        else
        {
            return StringType.NONE;
        }
    }
    public static StringType Check2(string s)
    {
        bool dig = false;
        bool let = false;
        bool other = false;
        for(int i = 0; i < s.Length; i++)
        {
            if(Char.IsDigit(s[i]))
            {
                dig = true;
            }
            else if(Char.IsLetter(s[i]))
            {
                let = true;
            }
            else
            {
                other = true;
            }
        }
        if(dig && !let && !other)
        {
            return StringType.NUMERIC;
        }
        else if(!dig && let && !other)
        {
            return StringType.ALPHABETIC;
        }
        else if(dig && let && !other)
        {
            return StringType.ALPHANUMERIC;
        }
        else
        {
            return StringType.NONE;
        }
    }
    private const int N = 1000000;
    public static void Main(string[] args)
    {
        Console.WriteLine(Check1("412132").ToString());
        Console.WriteLine(Check1("asdasdgfa").ToString());
        Console.WriteLine(Check1("asgagf134151").ToString());
        Console.WriteLine(Check1("æblegrød").ToString());
        Console.WriteLine(Check2("412132").ToString());
        Console.WriteLine(Check2("asdasdgfa").ToString());
        Console.WriteLine(Check2("asgagf134151").ToString());
        Console.WriteLine(Check2("æblegrød").ToString());
        long t1 = DateTime.Now.Ticks;
        for(int i = 0; i < N; i++) Check1("Foobar");
        long t2 = DateTime.Now.Ticks;
        for(int i = 0; i < N; i++) Check2("Foobar");
        long t3 = DateTime.Now.Ticks;
        Console.WriteLine("regex : " + (t2 - t1) + " custom : " + (t3 - t2));
    }
}
Avatar billede arne_v Ekspert
21. oktober 2004 - 21:10 #22
NUMERIC
ALPHABETIC
ALPHANUMERIC
ALPHABETIC
NUMERIC
ALPHABETIC
ALPHANUMERIC
ALPHABETIC
regex : 147968750 custom : 5781250
Avatar billede arne_v Ekspert
21. oktober 2004 - 21:11 #23
Custom løsning er 25 gange hurtigere !
Avatar billede prec Nybegynder
21. oktober 2004 - 21:32 #24
du er en knag, takker for alt hjælpen ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester