- Offizieller Beitrag
Hiermit lassen sich Min/Max -Werte aus bis zu 10 Einzelvariablen und/oder 1D-Arrays ermitteln. Die Werte können als echte 'Number' oder als Zahlenstring vorliegen. Nichtnumerische Werte und Nicht-Zahlenstrings werden ignoriert. Ausschließlich für den ersten Wert muß (sofern kein Array übergeben wird) zwingend ein Number/Zahlenstring übergeben werden, da dieser als erster Vergleichswert genutzt wird und nicht übergangen werden kann.
Da Number() eine Funktionslücke aufweist, verwende ich die Funktion in Kombination mit einer eigenen IsNumber/Digit/Float -Prüfung.
Um Parameter zu sparen, habe ich den Parameter für Array-StartIndex 'vergewaltigt', sodass ohne Vorzeichen die Funktion als MinNumber und mit '+' die Funktion als MaxNumber arbeitet.
Spoiler anzeigen
Local $a[5] = [3,2,8,78,9]
Local $a1[1] = [-1]
Local $a2[4] = [40,3,22,12]
; === erster Parameter für Min und Startindex der Arrays ==> hier also: 0
ConsoleWrite('Min: ' & _GetMinMaxNumber(0, $a2, 12, $a1, 5, 7, $a) & @CRLF)
; === erster Parameter für Max und Startindex der Arrays ==> hier also: '+0'
ConsoleWrite('Max: ' & _GetMinMaxNumber('+0', $a2, 12, $a1, 5, 7, $a) & @CRLF & @CRLF)
; === Arrays mit Startindex 1
Local $a[5] = [4,56,78,23,47]
Local $a1[3] = [2,352,-98]
Local $a2[2] = [1,117]
ConsoleWrite('Min: ' & _GetMinMaxNumber(1, $a, $a1, $a2) & @CRLF)
ConsoleWrite('Max: ' & _GetMinMaxNumber('+1', $a, $a1, $a2) & @CRLF & @CRLF)
; === ohne Array ist erster Parameter nur für Wahl Min ('') oder Max ('+')
ConsoleWrite('Min: ' & _GetMinMaxNumber('', '4', 8, 1+1+3, 12, '3.25', 5, 7, 'Text-String_wird_ignoriert') & @CRLF)
ConsoleWrite('Max: ' & _GetMinMaxNumber('+', '4', 8, 1+1+3, 12, '3.25', 5, 7, 'Text-String_wird_ignoriert') & @CRLF)
; #FUNCTION# ====================================================================================================================
; Name...........: _GetMinMaxNumber
; Description ...: Ermittelt den kleinsten Zahlenwert aus bis zu 10 übergebenen Einzelvariablen und/oder 1D-Arrays
; Syntax.........: _GetMinMaxNumber($sTypeIndx, $n1, $n2, $n3=Default, ... $n10=Default)
; Parameters ....: $sTypeIndx Start-Index übergebener Arrays mit Vorzeichen '+' für Rückgabe MaxNumber
; Für Rückgabe MinNumber braucht kein Vorzeichen übergeben werden.
; Werden keine Arrays verwendet, wird nur '+' für Max oder '' für Min übergeben.
; $n1...$n10 Einzelwerte und/oder 1D-Arrays
; Return values .: Erfolg kleinster/größter Zahlenwert aus allen Parametern
; Fehler Leerstring, @error: 1 ==> Einzelwert $n1 ist nicht numerisch
; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
; Remarks .......: Bei Verwendung von Arrays gilt für alle derselbe Startindex.
; Ist $n1 kein Array, muß der Wert zwingend numerisch/Zahlenstring sein. Andere Werte
; (auch innerhalb übergebener Arrays) werden ignoriert, wenn sie nicht numerisch/Zahlenstring sind.
; Als String übergebene Zahlen (Ganzzahlen, Float) werden beim Vergleich zu Number gewandelt.
; ===============================================================================================================================
Func _GetMinMaxNumber($sTypeIndx, $n1, $n2, $n3=Default, $n4=Default, $n5=Default, $n6=Default, $n7=Default, $n8=Default, $n9=Default, $n10=Default)
Local $min_max = $n1, $min_max2, $val, $max = 0
If StringLeft($sTypeIndx, 1) = '+' Then $max = 1
If $n2 == 'sub' Then
If UBound($n1) = $sTypeIndx +1 Then Return $n1[UBound($n1) -1]
$min_max = $n1[$sTypeIndx]
For $i = $sTypeIndx +1 To UBound($n1) -1
If StringRegExp($n1[$i], '\A[-+]{0,1}\d+\.{0,1}\d*\z') Then
$n1[$i] = Number($n1[$i])
Else
ContinueLoop
EndIf
If $max Then
If $n1[$i] > $min_max Then $min_max = $n1[$i]
Else
If $n1[$i] < $min_max Then $min_max = $n1[$i]
EndIf
Next
Return $min_max
EndIf
If IsArray($min_max) Then
$min_max = _GetMinMaxNumber($sTypeIndx, $min_max, 'sub')
Else
If StringRegExp($min_max, '\A[-+]{0,1}\d+\.{0,1}\d*\z') Then
$min_max = Number($min_max)
Else
Return SetError(1,0,'')
EndIf
EndIf
For $i = 2 To 10
$val = Eval('n' & $i)
If IsKeyword($val) Then ExitLoop
If IsArray($val) Then
$min_max2 = _GetMinMaxNumber($sTypeIndx, $val, 'sub')
If $max Then
If $min_max2 > $min_max Then $min_max = $min_max2
Else
If $min_max2 < $min_max Then $min_max = $min_max2
EndIf
Else
If StringRegExp($val, '\A[-+]{0,1}\d+\.{0,1}\d*\z') Then
$val = Number($val)
If $max Then
If $val > $min_max Then $min_max = $val
Else
If $val < $min_max Then $min_max = $val
EndIf
EndIf
EndIf
Next
Return $min_max
EndFunc ;==>_GetMinMaxNumber