numerischer string auf nichtnumerische Zeichen prüfen

  • VB.NET

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

    Hallo, noch mehr Beispiele bringen auch nix, die nichtnumerischen Zeichen sind beliebig.
    @erfinder: natürlich wird der Satz erstmal gesplittet und dann das 4. Element in Integer umgewandelt. Anders gehts wohl schlecht.

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



    Warum ist ein einfacher Test so kompliziert?? Eigentlich genügt eine einfache Funktion "isnumeric(Wert)" und es kommt true oder false zurück. Solche Verkomplizierungen einer Programmiersprache schrecken nur ab. Meine Muttersprache ist Assembler, da gibt es einen übersichtlichen Satz von Befehlen, keine Redundanzen, da läuft alles schnörkellos ab. Und so sollte es auch bei einer Hochsprache sein.
    Richard
    Aber in Assembler hast du weder eine Funktion die einen Wert auf eine Zahl überprüft, noch verkomplizieren viele Funktionen/syntactic sugars eine Sprache. Es vermehrt den Lernaufwand, aber senkt den Programmieraufwand auf lange sicht erheblich und das spart Zeit, Geld und bringt Wartbarkeit und Lesbarkeit mit sich.

    Bei einer Hochsprache wird es gezwungener maßen Redundanzen geben. Aber du wirst überrascht sein, wie viele Redundanzen es bereits in ASM gibt, es gibt genügend Befehle die im Grunde dasselbe machen, aber trotzdem getrennt gehalten wurden(SUB/CMP z.B.)

    Abgesehen gibt es ja die Funktion char.IsNumeric die einen einzelnen character überprüft. Eine solche Funktion auf einen string ergibt keinen Sinn und eine Zahl zu parsen, die Random Werte zwischen drinne hat gibt in aller Regel auch keinen Sinn, das würde nur bei den Grundsätzlichen Anwendungsfällen zu Problemen führen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Eigentlich möchte ich hier dieses Thema nicht vertiefen. Aber einige Anmerkungen möchte ich doch dazu machen:

    ​Aber in Assembler hast du weder eine Funktion die einen Wert auf eine Zahl überprüft


    Im IBM Assembler schon. Es gibt Makros, die wie Unterprogramme oder Befehle eingesetzt werden können.

    ​Aber du wirst überrascht sein, wie viele Redundanzen es bereits in ASM gibt


    Das gilt vielleicht für den x86, den ich wenig schätze, weil die Intel-Prozessoren zu umständlich zu programmieren sind. Ich stehe halt auf dem IBM Assembler, wenig Befehle, einfach und transparent.

    So hiermit beende ich die Diskussion meinerseits.
    Richard
    Ja wie gesagt char.IsNumeric ich verstehe das Problem nicht.

    Und auch in deinem Assembler kannst keinen kompletten string überprüfen(oder etwa doch?). Und wenn doch, geht in C# ja auch, mit int.TryParse, wenn da nämlich false zurück kommt ist es keine reine Zahl. Und zum Filtern und anschließenden parsen gibts ja jetzt einige Codeschnipsel, die du in ASM genau so aufwendig(und weniger leserlich) schreiben müsstest. Mein erstes schnipsel ist dabei wohl das performanteste, obwohl man es sogar noch weiter optimieren kann.

    Die gazen neuen Syntactic Sugar die in C# jetzt so dazu kommen, sind stark an funktionale Programmiersprachen angelehnt, welche es jetzt schon lange genug gibt: de.wikipedia.org/wiki/ML_(Programmiersprache) hat dabei viele Sachen gezeigt. D.h. es ist quasi back to the roots und nicht einfach neues Zeugs...

    /OT:
    nicht böse nehmen^^
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    also jetzt zum letzten Mal:

    ​Und auch in deinem Assembler kannst keinen kompletten string überprüfen


    Sicher kann ich das, es gibt die Befehle TR und TRT, der String kann maximal 256 Bytes lang sein. Auch in der Hochsprache wird beim Datentransfer jedes Byte in einer Schleife einzeln übertragen, nur es sieht keiner. Beim Assembler heißt das MVC für maximal 256 byte oder MVCL für längere Daten, aber dafür braucht man mehrere Register. Intern wird bei allen Befehlen ein Microprogramm gestartet, das alles byteweise verwurschtelt. Jeder Compiler einer Hochsprache erzeugt ein Assemblerprgramm, das für einen Prozessor ausführbar ist, nur hat dieses Programm noch einen großen Overhead, der gegenüber einem originären Assemblercode deutlich langsamer ist.
    Na gut ich bin in 25 Jahren Systemprogrammierung ergraut aber es gibt einige Dinge die in Hochsprachen nicht so leicht zu implementieren sind z.Bsp. asynchrones Arbeiten, Interrupt Processing und Prozessornahen Funktionen.
    Richard
    P.S, Eigentlich wollte ich das jetzt beenden.
    Ich wollte es eigt. auch schon lang beenden nur wie du halt eben auf meiner Meinung :P
    Du brauchst mir weder erklären wie Assembler funktioniert noch was Compiler machen und Mikropgrogramme durfte ich auch schon schreiben(natürlich nicht für den Einsatz gedacht), ich denke das weiß ich mehr als gut genug.
    Ich sehe wie du TRT verwendest um zu überprüfen aber da musst dir ja auch ne Lookup Table anlegen, das ist nicht so als wäre der Befehl fertig perfekt dafür da was du genau vor hast.

    C#-Quellcode

    1. bool isNaN = str.Any(x=>!char.IsNumeric(x));

    liest sich fast wie text und macht was du willst. Du kannst jetzt natürlich nicht erwarten, dass da TR drauß wird. Aber .Net ist auch hauptsächlich für x86/x64 programmiert, alles andere sind nur private Ports.
    Ansonsten empfehle ich dir C++

    C-Quellcode

    1. __asm__("dein assembler code");

    ribart schrieb:

    , nur hat dieses Programm noch einen großen Overhead, der gegenüber einem originären Assemblercode deutlich langsamer ist.

    Vorsicht mit solchen aussagen wie sooft kommt es darauf an wie man programmiert. Compiler können bereits sehr gut optimieren. Natürlich kann ein Mensch besser optimieren, aber nur wenn es jemand ist, der es auch kann. Und da bringen dir auch 25 Jahre Erfahrung nichts, denn du musst für den spezifischen Prozessor optimieren und da macht es dann auch einen Unterschied ob AMD oder Intel, oder welche Version des Prozessors, Compiler beachten diese Dinge bereits begrenzt. Als Mensch kannst du das alles gar nicht kennen. Es gibt natürlich auch Assembler die optimieren sag ich ja auch nichts, musst aber auch machen. Und dass .Net nicht der Held im optimieren ist sag ich auch nichts. Aber warum nutzt du überhaupt eine JIT Sprache, wenn es dir so stark um Optimierung geht? :D

    Also nochmal zum Abschluss:
    Entweder reden wir total an einander vorbei oder du erwartest einfach etwas total falsches von einer Hochsprache. Eine Hochsprache ist nicht dafür da alle möglichen Befehle zu beinhalten die du irgendwann mal eventuell brauchen könntest(Wenn es so wäre würde das .Net Framework deine ganze Platte einnehmen). Sondern soll dabei helfen Code zu abstrahieren und wieder zu verwenden. Gut lesbaren und wartbaren Code zu machen. Keine Sprache ist bei diesen Aufgaben perfekt, manche sind für manches besser, andere Dinge werden subjektiv entschieden, aber es ist immerhin um vieles besser als wenn es das nicht tut. Für bereits geschriebene Befehle gibt es dann Frameworks/Libraries, die man dann halt sich dementsprechend dazu packt, was man braucht(Ganz Nett in .Net ist z.B. nuget)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---