"We are back" « oc.at

C#: Int aus String extrahieren

grassi3000 16.08.2004 - 18:09 5226 15
Posts

grassi3000

radeon gefrierer
Avatar
Registered: Apr 2003
Location: AT/NÖ/Traisen
Posts: 1161
Tja, wie mach ich das am einfachsten?
Beispiel: ich hab den String "Schüler 3A"

Ich weiß, dass genau eine einstellige Int Zahl drinnen ist, allerdings nicht deren Position innerhalb des Stringes, und auch nicht ihren Wert.
Bearbeitet von grassi3000 am 17.08.2004, 15:38

dio

Here to stay
Registered: Nov 2002
Location: Graz
Posts: 4941
regular expressions. da ich mit c# nix am hut hab, musst dich selbst um die funktionen kümmern ;).

grassi3000

radeon gefrierer
Avatar
Registered: Apr 2003
Location: AT/NÖ/Traisen
Posts: 1161
ah, daran hab ich nicht gedacht.
thx für den tip!

grassi3000

radeon gefrierer
Avatar
Registered: Apr 2003
Location: AT/NÖ/Traisen
Posts: 1161
ok, leider hat mich der Tip nur teilweise weitergebracht, da ich nur gefunden habe, wie ich durch escape sequenzen entweder nach whitespace oder nach "word boundary" sequenzen suchen kann. word boundary beinhalten allerdings sowohl zahlen als auch buchstaben.

mir würde schon reichen, wie ich einfach die position des integer - werts im String bekomme.

sliver33

Big d00d
Avatar
Registered: Sep 2001
Location: Alkoven
Posts: 273
Mein Gebiet ist zwar eher JAVA aber wie ich immer sag C# is eh des gleiche nur halt von M$.

In Java würd ichs so machen:
String.split(" "); Dann bekommst du ein Array mit {Schüler,3A}
und dann nimmst du mit substr(0,1) den ersten Buchstaben (in diesem Fall Zahl) vom zweiten Element;

Source:
String schStr = "Schüler 3A";
Array a = schStr.split(" ");
String number = a[1].substring(0,1);

Du musst dir jetzt nur noch die C# Funktionen dazu suchen.

grassi3000

radeon gefrierer
Avatar
Registered: Apr 2003
Location: AT/NÖ/Traisen
Posts: 1161
thx, werds gleich ausprobieren.

rettich

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
Zitat von sliver33
String.split(" "); Dann bekommst du ein Array mit {Schüler,3A}

aber nur, wenn das beispiel IMMER so aussieht wie oben.

anderer ansatz: den string exploden, sodass jeder character in einem eigenen feld eines arrays steht.

dann die felder der reihe nach durchgehen und schauen, von welchem zeichen der char-wert im bereich der integer-zahlen liegt (laut ascii tabelle). oder du machst dir eine vb-like isnumeric funktion, die dir sagt, ob das ganze ein numeric-wert ist oder nicht:

Code:
public bool IsNumeric(string s)
{
      try {
          Int32.Parse(s);
      }
      catch {
          return false;
      }
    return true;
} 

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
Ich hab auch noch nie C# programmiert aber mit regulären Ausdrücken müssts so ähnlich gehen:

Code:
public String GetFirstNumber(String str) {
  RegEx r = new RegEx("([0-9])");
  Match m = r.Match(str);
  return m.Result("$1");
}

rettich

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
regex sind in c# (wie alle string-operationen) schweinelangsam.

aber solangs keine performance issues gibt: http://windows.oreilly.com/news/csharp_0101.html

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
@rettich: Also nix für ungut aber reguläre Ausdrücke sind - in jeder Sprache - ungefähr 100 mal schneller, als einen String in ein String-Array aufzusplitten und dann für jeden Teil mit einer Funktion, in der ein Try-Catch-Block ist (!!) die Werte zu überprüfen. Außerdem lässt sich die Funktionalität mit regulären Ausdrücken besser erweitern, wenn die Zahlen z.B. zweistellig benötigt werden.

dio

Here to stay
Registered: Nov 2002
Location: Graz
Posts: 4941
@grassi: wieso sollt des mit regexp ned gehn :confused:

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25551
nein.. rettich hat recht! :D

regex sind meistens langsamer als andere lösungen.. brauchen ja auch eine finite statemachine, dafür sind regex auch erweiterbarer.

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11343
Regex haben dafür ein hohes Optimierungspotenzial, wenn man gleiche Ausdrücke oft benutzt - man kann die Statemachine ja zur Laufzeit in ausführbaren Code compilieren.

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25551
ich weiss that :)

ich wollte nur diesen satz
Zitat
ungefähr 100 mal schneller, als einen String in ein String-Array aufzusplitten und dann für jeden Teil mit einer Funktion, in der ein Try-Catch-Block ist (!!) die Werte zu überprüfen
kritisieren.

rettich

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
zugegeben, das mit dem try-catch block ist sicher nicht die sauberste und schnellste lösung - vor allem, wenn man es für jedes element des arrays durchführt (die die schüler alle "alexander christian kraushuber-birnbauer 3A" heißen :D)

und die aussage mit dem "erweiterbar" stimmt auch. ideal wäre überhaupt, die parameter in einem ini-file von außen wartbar usw

leider sind die regex, wie mat schon gesagt hat, in c# (und nicht nur dort) etwas lahm. für diese, sicher nicht zeitkritische anwendung sind sie aber sicher brauchbar. deswegen oben auch mein link.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz