Im Thread :
IsNumber mit String, der nur Zahlen enthält
hat BugFix auf folgendes Problem hingewiesen :
Die Standardfunktion Number() zeigt in einem Fall ein unerwartetes Verhalten. Strings werden zu 0 konvertiert, aber "0" auch (Details siehe stackoverflow) !
Der Link in seinem Beitrag ist aber einem Forumsupdate zum Opfer gefallen.
(Der Thread selbst wurde geschlossen - daher konnte ich dort nicht 'reinschreiben)
Da ich die Funktion gerade selbst brauche, hier, für Interessierte, der entsprechende Code
Quelle : https://stackoverflow.com/questions/5097…ing-to-a-number
v0.1
; #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
Gruß Musashi
EDIT BugFix:
Ich habe die Positionen aus dem Diskussionsverlauf mal aufgenommen und die Funktion entsprechend angepasst.
- Es werden jetzt auch negative Werte erkannt
- Im Fehlerfall wird ein (frei festlegbarer) numerischer Wert zurückgegeben. Standard ist 0xDEADBEEF
Es ist schon sinnvoller bei einer Funktion, die numerische Werte zurückgeben soll, dies auch im Fehlerfall zu tun.
Bei Übergabe von Werten mit Vorzeichen, wird auch ein Leerzeichen zwischen Vorzeichen und Digit akzeptiert (sowohl: -1.25 als auch - 1.25).
EDIT2 BugFix: ---> Hier hatte ich zwar die Erkennung des Leerzeichens zwischen Vorzeichen und Ziffer berücksichtigt, aber nicht entsprechend behandelt.
Nun sollte es aber fehlerfrei sein:
EDIT3 BugFix: Signed Numbers könnten ja auch positive Vorzeichen haben...
v0.4
;-- TIME_STAMP 2018-12-17 22:47:43 v 0.4
; #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.
; ...............: $_iErrReturn - The numeric return value in error case. Default: 0xDEADBEEF
; ...............: You get also the default value by passing "Default" or empty string instaed.
; ...............: $_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 (un/signed) number.
; ...............: Failure The Value from "$_iErrReturn", 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, $_iErrReturn=0xDEADBEEF, $_Flag=0)
If $_iErrReturn = Default Or $_iErrReturn = '' Then $_iErrReturn = 0xDEADBEEF
If StringRegExp($_Expression, '^([-+]\d|\d)') Then
Return Number($_Expression, $_Flag)
ElseIf StringRegExp($_Expression, '^[-+]\s\d') Then
$_Expression = StringRegExpReplace($_Expression, '^([-+])\s(\d)(.*)', '\1\2\3')
Return Number($_Expression, $_Flag)
Else
Return SetError(1, 0, $_iErrReturn)
EndIf
EndFunc ;==>_Number
Alles anzeigen