numerischer string auf nichtnumerische Zeichen prüfen

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    numerischer string auf nichtnumerische Zeichen prüfen

    Hallo, ich möchte ein Datum, das als numerischer String vorliegt und dann in Integer konvertiert wird, darauf prüfen, ob nicht numerische Zeichen in diesem String vorhanden sind.
    Vielen Dank
    Richard
    Am einfachsten wird das wohl über RegEx gehen.
    Datum als String speichern (ich gehe mal vom Format hhmmssttmmjjjj, also meinetwegen 15000021082017, aus)
    Und dann über RegEx.Match jedes Zeichen auf einen "Match" testen und ein entsprechendes Flag setzen und falls du ein nicht numerisches Zeichen findest, die Schleife abbrechen

    Oder das Ganze zu Fuß machen, indem du das "Datum" in einer Schleife durchläufst (wie oben) und selber jeweils das aktuelle Zeichen von Char auf Integer castest und anschlißend prüfst, ob 0, 1, 2, 3, 4..., 9 ist.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    ribart schrieb:

    Datum, das als numerischer String vorliegt
    soll aus welchem Grund in ein Integer konvertiert werden?
    Wie sieht der Datumsstring aus?
    Wie ist dieser Integer definiert?
    Ist es nicht sinnvoller, aus dem Datum-String ein Datum zu machen und danach das Datum in einen String zu konvertieren?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    hallo rodfromgermany, mit Datum ist die Einzahl von Daten gemeint. Ich lese aus einer Datei einen Satz, der Zahlen als String enthält, darunter auch diese Integer Zahl, die aber leider manchmal mit Buchstaben "verseucht" ist. Mit Buchstaben versehen ist sie nicht konvertierbar. Deshalb meine Frage.
    Richard

    ribart schrieb:

    ich versuchs mal mit den reg.Expressions, da kann man gleich den nichtnumerischen Teil entfernen.


    Ja, wäre nur toll gewesen, wenn die Information (das Du den nicht-numerischen Teil entfernen willst) gleich mitgeliefert hättest. Das ist etwas ganz anderes (IMO) also nur zu prüfen. Also warum nicht gleich die richtige Aufgabenstellung posten?
    Hallo, Dksksm, muss ich mich jetzt rechtfertigen, wie ich mein Problem beschreibe. Ich wollte zuerst prüfen und dann den Wert ignorieren, jetzt habe ich von Eurer Seite eine Lösung gefunden wie ich den Wert doch noch verwenden kann.
    Richard

    ribart schrieb:

    mit Datum ist die Einzahl von Daten gemeint.
    OK. Diese Frage wäre noch zu beantworten, bevor möglicherweise unpassende Lösungevorschläge die Runde machen:

    RodFromGermany schrieb:

    Wie sieht der Datumsstring aus?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Edit: kleine Optimierung

    C#-Quellcode

    1. var num = 0,d=1;
    2. for(int i=str.length-1;i>=0;i--)//von hinten durchgehen
    3. {
    4. var c =(int)(str[i] - '0');//ASCII Werte für Zahlen auf 0-9 zwingen
    5. if (c >= 0 && c < 10)//alles außerhalb dieses bereiches ist keine Zahl
    6. {
    7. num+=w*c;
    8. w *= 10;
    9. }
    10. }

    Oder auch:

    C#-Quellcode

    1. int.TryParse(new string(str.Where(x=>char.IsNumber(x))),...)

    Wie immer nur so oder so ähnlich^^
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „jvbsl“ ()

    @jvbsl Ich denke mal, dass sich das mit nem Einzeiler lösen lässt, wenn wir wüssten, wie die Daten-Strings von @ribart aussehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da das Interesse an den Daten besteht hier eine Auswahl von zwei Datensätze:

    ArII $ 302.8721 $ 302.872055 $ 3bl $ 172213.8798 $ 205221.512 $ 3s23p4(1D)4p $ 2P° $ 3/2 $ 3s23p4(3P)5d $ 2P $ 3/2 $ L14821
    ArII $ 302.89140 $ 302.891004 $ 47 $ 163299.5616 $ 196305.1289 $ 3s23p4(1D)3d $ 2F $ 5/2 $ 3s23p4(3P1)4f $ 2[3]° $ 7/2 $ L11520

    Interessant ist für mich nur die erste, zweite und vierte Spalte, in der 4. Spalte sind manchmal neben der Zahl noch andere beliebige Zeichen vorhanden.
    Richard
    Hallo Erfinder, die Datensätze sind Daten des Argonspektrums, ArII bedeutet zweifach ionisiert,es gibt auch ArIII oder ArI, das $-Zeichen ist der Spaltentrenner, ich dachte das erkennt man sofort.
    Richard
    @RodFromGermany: das zweite ist nen Einzeiler außerdem geht es nicht immer um die kürze des Codes, denn was auch immer du für nen Einzeiler hast ich denke fast, der ist unperformanter :P(wobei man den Code oben noch weiter optimieren kann, ich editier grad mal eine kleine Optimierung rein - und mit unsafe würde noch mehr gehen :D)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    ribart schrieb:

    das $-Zeichen ist der Spaltentrenner, ich dachte das erkennt man sofort.
    nee - also ich zumindest nicht.
    Egal - nun weiss ich: Du willst "3bl" und "47" nach Integer konvertieren. Letzteres ist einfach - geht mit Integer.Parse(). Bei ersterem müsste man zuvor alle Zifferzeichen "herauspicken" - käme dann zB so raus:

    VB.NET-Quellcode

    1. Dim i = Integer.Parse("3bl".Where(AddressOf Char.IsDigit).ToArray)
    ach - das ist ja fast dasselbe wie jvbsl's 2. Vorschlag, nur in vb

    ribart schrieb:

    ich dachte das erkennt man sofort.
    Davon darfst Du hier nicht ausgehen.
    Jede Information ist wichtig, jede Nicht-Information führt zu Spekulatius und weg vom Ziel.

    ribart schrieb:

    in der 4. Spalte sind manchmal neben der Zahl noch andere beliebige Zeichen vorhanden.
    deren Anzahl wie hoch sein kann?
    Haste dafür auch noch ein Beispiel?
    @jvbsl Ich bin da auch eher ein ausführlich-Schreiber, da ist mir das Verständnis nach einem halben Jahr wichtiger. Das wird bei @ribart mit Deinem und des @ErfinderDesRades Einzeiler wohl nicht so sein. :/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    da ist mir das Verständnis nach einem halben Jahr wichtiger. Das wird bei @ribart mit Deinem und des @ErfinderDesRades Einzeiler wohl nicht so sein.
    Wat?

    VB.NET-Quellcode

    1. "3bl".Where(AddressOf Char.IsDigit)
    Verständlicher kann man nicht formulieren, dass nur die Digits gemeint sind!

    Allenfalls @ribart (noch) unvollständige Sprachkenntnisse können ihm ein Problem machen, aber das wird sich in 1/2 Jahr ja verbessern.

    VB.NET-Quellcode

    1. Integer.Parse("3bl".Where(AddressOf Char.IsDigit).ToArray)
    Integer.Parse, .Where, AddressOf, .ToArray - das ist alles Must-Know-no-excuses, wenn man .Net programmiert.
    Weil klar: Für einen der nicht die Grundlagen der Sprache kann, ist wohl jeder gute Code unverständlich.
    Aber kann er sie, versteht er das auch in 10 Jahren, und besser als so einen listigen, selbstgebastelten Parse-Algo (post#10, snippet#1)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Deshalb kommt der in ne methode ParseIgnoreNonNumerics.
    Außerdem lässt char.IsDigit alles zu was char.IsNumeric zulässt+Dezimaltrennzeichen. Wollen wir bei int denk ich nicht. Und selbst IsNumeric könnte ein Problem sein, da es anscheinend auch Zahlendarstellungen aus anderen Sprachen/Zeichensätzen zu lässt, was das genau bedeutet - keine Ahnung. Ob es überhaupt stimmt - keine ahnung. Ob int.Parse damit klar kommt - keine Ahnung^^
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    ErfinderDesRades schrieb:

    Wat?
    Wenn Du Deinen Einzeiler auf den String "11 22 33" anwendest, kommt "112233" ==> 112233 raus, und ich denke nicht, dass @ribart das gemeint hat.
    Bei dem langen String in seinem Beispiel gibt es eine OverflowException, weil einfach zu viele Ziffern aufgesammelt werden, die nix miteinander zu tun haben. :/
    Mit nem zweifachen Split sieht man besser, was da passiert. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!