- 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()
; #FUNCTION# ====================================================================================================================
; Name ..........: _Number
; Description ...: Works like "Number()", but avoids to convert a string to number 0!
; Syntax ........: _Number($_Expression, $_Flag)
; Parameters ....: $_Expression - An expression to convert into a number.
; ...............: $_Flag - Can be one of the following:
; ...............: $NUMBER_AUTO (0) = (default) the result is auto-sized integer.
; ...............: $NUMBER_32BIT (1) = the result is 32bit integer.
; ...............: $NUMBER_64BIT (2) = the result is 64bit integer.
; ...............: $NUMBER_DOUBLE (3) = the result is double.
; Return values .: Success The converted number, if $_Expression is a number or starts with a number.
; ...............: Failure Empty string, sets @error = 1 $_Expression is a string or starts with a string.
; Author ........: BugFix
; Remarks .......: In contrast to Number(), you get only a number, if $_Expression is a number or starts with it.
; ...............: Because 0 is also a number, Number() give unclear results:
; ...............: Number("foo") returns 0. Number("0") returns also 0. "0" converts to the real number 0, but "foo" also??
; ===============================================================================================================================
Func _Number($_Expression, $_Flag=0)
If StringRegExp($_Expression, '\A(\D+)') Then
Return SetError(1, 0, '')
Else
Return Number($_Expression, $_Flag)
EndIf
EndFunc ;==>_Number
Alles anzeigen
DL bisher: 158