Fehlerhafte Rückgabe der Funktion Number() behoben mit _Number()

    • Offizieller Beitrag

    Number() weist eine "Fehlfunktion" auf. Folgendes Szenario:
    Zahlenwerte liegen in Variablen im Stringformat vor. Ich möchte nur die Variablen verarbeiten, die auch Zahlenwerte sind.
    Dazu habe ich ja die Möglichkeit den String in eine Zahl zu konvertieren mit Number(). Das führt aber zu dem unkontrollierten Zustand, dass alle Nichtzahlenwerte als 0 zurückgegeben werden.
    Bsp:
    $ret = Number('0')     ; Rückgabe 0
    $ret = Number('Z')     ; Rückgabe 0 aber keinen Fehler
    ==> keine Unterscheidung zwischen beiden Ergebnissen möglich !


    Mit IsNumber() kann ich keine Überprüfung durchführen, vor Anwendung von Number() gibt IsNumber() natürlich "False" zurück,
    danach aber IMMER "True", weil Number() im Fall des Nichterfolges eine 0 zurückgibt und bei Erfolg natürlich den Zahlenwert.

    Deshalb hier meine Funktion _Number(), die diesen Missstand beseitigt.
    Ich überprüfe mit einem Regulären Ausdruck ob die Zeichenkette mit einem nicht-numerischen Zeichen beginnt. Falls JA, wird einen Leerstring zurückgegeben und @Error auf 1 gesetzt. (Number() würde 0 zurückgeben)

    EDIT 2018-06-22:

    Nach 10 Jahren sieht man auch an so einer kleinen Funktion noch Verbesserungspotential.

    Ich habe die Funktion mal etwas vereinfacht und erweitert, sodass sie exakt wie Number() arbeitet (inkl. der möglichen Flags) und nur bei Übergabe eines Ausdrucks der ein String ist oder mit einem String beginnt einen Leerstring zurückgibt und @error setzt.

    _Number()

    DL bisher: 158

  • Beim Lesen Deines Codes fiel mir wieder ein warum ich um StringRegEx beim Übersetzen einen großen Bogen gemacht habe ;)
    Schöne Lösung :)

    Gruß,

    TrueMu

    • Offizieller Beitrag

    Hallo

    Sieht gut aus, aber es geht auch noch etwas einfacher ;)

    Spoiler anzeigen
    [autoit]

    MsgBox(0, 'Vergleich: Number() vs. _Number()', _
    ' Number("Z")' & @TAB & '>>' & Number('Z') & '<<' & @TAB & 'Error: ' & @error & @LF & _
    '_Number("Z")' & @TAB & '>>' & _Number('Z') & '<<' & @TAB & 'Error: ' & @error)
    ;==================================================================================================
    ; Name: _Number($iNumber)
    ; Return: Erfolg: Numerischer Wert des Ausdrucks
    ; Fehler: Leerstring
    ; Fehlerwert: 1
    ;==================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func _Number($iNumber)
    If StringIsDigit(String($iNumber)) Then
    Return Number($iNumber)
    Else
    Return SetError(1,0,'')
    EndIf
    EndFunc

    [/autoit]

    Mfg Spider

    • Offizieller Beitrag

    GtaSpider : JEIN :P, wenn schon gleiche Funktionalität, dann ..StringIsDigit Or StringIsFloat Or StringIsInt...

    @TrueMu:
    :D also dieser Ausdruck ist eigentlich recht überschaubar. Ich erklär es mal:

    Code
    \A         = Ankerpunkt Start (alle Matches zwischen Start und Ende müssen EIN String sein)
    [-+]{0,1}  = Zeichenklasse bestehend aus + und - , + oder - können 0- oder1-mal auftreten
    \d+        = Zeichen 0 bis 9,  MUSS einmal, kann beliebig oft auftreten
    \.{0,1}    = Punkt (Dezimaltrennzeichen), kann 0- oder1-mal auftreten
    \d*        = Zeichen 0 bis 9,  MUSS NICHT, kann beliebig oft auftreten
    \z         = Ankerpunkt Ende
  • Danke, Bugfix.

    Ist bei mir halt so, vor ca. 18 Jahren habe ich unter Unix mit vi und regulären Ausdrücken hantiert. Damals habe ich es dann echt vermisst als ich auf Windows umgestiegen bin. Aber seit damals ist soviel Gehirnschmalz den Bach runtergegangen.... Damit könnte man 3 Alzheimer Diagnosen stellen ;)

    Na ja, wenn ich es brauche, werde ich mich wohl wieder reinfinden, aber war bisher nicht nötig.

    Gruß,

    T.