- Offizieller Beitrag
Hi,
es war heute die Frage wie man nach einer bestimmten Anzahl Zeichen splitten kann.
Diese Lösung paßt in einen Einzeiler. Ich habe aber das nun etwas flexibler gemacht.
- Splitten von Anfang oder Ende (Standard: von Anfang)
- Ergebnis LeftToRight (Standard) oder RightToLeft
_StringSplit_ByCount( )
$s = 'Abcde3ghijKlmnop2rstUvwxy1'
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite('von Li - LTR' & @CRLF)
$ret = _StringSplit_ByCount($s, 10)
For $i = 0 To UBound($ret) -1
ConsoleWrite($ret[$i] & @CRLF)
Next
ConsoleWrite(@CRLF)
ConsoleWrite('von Li - RTL' & @CRLF)
$ret = _StringSplit_ByCount($s, 10,0,1)
For $i = 0 To UBound($ret) -1
ConsoleWrite($ret[$i] & @CRLF)
Next
ConsoleWrite(@CRLF)
ConsoleWrite('von Re - LTR' & @CRLF)
$ret = _StringSplit_ByCount($s, 10,1)
For $i = 0 To UBound($ret) -1
ConsoleWrite($ret[$i] & @CRLF)
Next
ConsoleWrite(@CRLF)
ConsoleWrite('von Re - RTL' & @CRLF)
$ret = _StringSplit_ByCount($s, 10,1,1)
For $i = 0 To UBound($ret) -1
ConsoleWrite($ret[$i] & @CRLF)
Next
ConsoleWrite(@CRLF)
;===============================================================================
; Function Name: _StringSplit_ByCount($s_String, $i_Count [, $i_FromEnd=0 [, $i_RTL=0]])
; Description: Splitten eines Strings nach Anzahl Zeichen
; Parameter(s): $s_String der zu splittende String
; $i_Count Zeichenzahl nach der zu splitten ist
; $i_FromEnd Splitten am Ende beginnen (Standard 0 - vom Anfang)
; $i_RTL 1 - String RightToLeft zurückgeben (Standard 0 - LTR)
; Return Value(s): Erfolg - Array mit den Splitergebnissen
; Fehler - Leerstring
; set @error: 1 (String zu kurz)
; 2 ($iCount größer Stringlänge)
; 3 (RTL fehlgeschlagen)
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
; RTL is _StringRevers function
;===============================================================================
Func _StringSplit_ByCount($s_String, $i_Count, $i_FromEnd=0, $i_RTL=0)
If StringLen($s_String) < 2 Or $i_Count < 1 Then Return SetError(1,0,"")
If $i_Count > StringLen($s_String) Then Return SetError(2,0,"")
If $i_FromEnd <> 0 Then $i_FromEnd = 1
If $i_RTL <> 0 Then $i_RTL = 1
Local $a_Tmp[Ceiling(StringLen($s_String)/$i_Count)]
If $i_FromEnd Then
For $i = 0 To UBound($a_Tmp) -1
$a_Tmp[$i] = StringRight($s_String, $i_Count)
$s_String = StringTrimRight($s_String, $i_Count)
Next
Else
$a_Tmp = StringRegExp($s_String, '.{1,' & $i_Count & '}', 3)
EndIf
If $i_RTL Then
For $i = 0 To UBound($a_Tmp) -1
Local $i_len = StringLen($a_Tmp[$i])
Local $t_chars = DllStructCreate("char[" & $i_len + 1 & "]")
DllStructSetData($t_chars, 1, $a_Tmp[$i])
Local $a_rev = DllCall("msvcrt.dll", "ptr:cdecl", "_strrev", "ptr", DllStructGetPtr($t_chars))
If @error Or $a_rev[0] = 0 Then Return SetError(3,0,"")
$a_Tmp[$i] = DllStructGetData($t_chars, 1)
Next
EndIf
Return $a_Tmp
EndFunc ;==>_StringSplit_ByCount