Home » AutoIt v3

_StringPad 字串左右補齊

假如有個欄位是要填 3 位數的民國年,像是 097 這一類的話,若只輸入 97 這樣的 2 位數時,就要在前面多幫它補一個 0 或是空格好湊成 3 位數。這種方法叫做 PadLeft

何謂 PadLeftPadLeft 是將指定的字串靠右對齊,以空格或是指定的字元在左側填補至指定的長度

那既然有 PadLeft,那當然也有 PadRight 囉。PadRight 是跟 PadLeft 相反的,PadRight 是將指定的字串靠左對齊,以空格或是指定的字元在右側填補至指定的長度

這邊筆者提供 3 種不同的方式來達到 Pad 的效果。

1.使用 String UDF 中的 _StringRepeat 函式

檢視原始碼 AutoIt v3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#cs
版本:AutoIt v3 3.2.12.0
環境:Windows XP SP2
#ce
;載入 String 的 UDF
#include <String.au3>
 
#cs
函式名稱:
	StringPad
函式描述:
	依指定的符號、長度及方向(左右)來補齊字串
需要參數:
	$string         要處理的字串
	[$length]       如果字串不滿 $length 則使用 $sign 補滿,預設為 $string 的長度
	[$sign]         用來補滿用的字串(符號),預設為 " "(空白)
	[$direction]    Pad 的方式,預設為 PadRight
回傳型態:
	String          Pad 後的字串
注意事項:
	需 #include <String.au3>
#ce
Func _StringPad($string, $length = -1, $sign = -1, $direction = 1)
 
    ;若 $length 為 -1 時則 $length 值為 $string 的長度
    If Not $length Then $length = StringLen($string)
    ;若 $sign 為 -1 時則 $sign 值為 " "(空白)
    If Not IsString($sign) Then $sign = " "
 
    ;如果 $string 長度沒有小於 $length 時則直接回傳
    If StringLen($string) >= $length Then return $string
 
    If $direction = 1 Then ;PadRight
        Return $string & _StringRepeat($sign, $length - StringLen($string))
    Else                   ;PadLeft
        Return _StringRepeat($sign, $length - StringLen($string)) & $string
    EndIf
EndFunc

注意:因有使用到 _StringRepeat() 所要要記得 #include

2.使用遞迴

檢視原始碼 AutoIt v3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#cs
版本:AutoIt v3 3.2.12.0
環境:Windows XP SP2
#ce
 
#cs
函式名稱:
	_StringPad
函式描述:
	依指定的符號、長度及方向(左右)來補齊字串
需要參數:
	$string         要處理的字串
	[$length]       如果字串不滿 $length 則使用 $sign 補滿,預設為 $string 的長度
	[$sign]         用來補滿用的字串(符號),預設為 " "(空白)
	[$direction]    Pad 的方式,預設為 PadRight
回傳型態:
	String          Pad 後的字串
#ce
Func _StringPad($string, $length = -1, $sign = -1, $direction = 1)
 
    ;若 $length 為 -1 時則 $length 值為 $string 的長度
    If Not $length Then $length = StringLen($string)
    ;若 $sign 為 -1 時則 $sign 值為 " "(空白)
    If Not IsString($sign) Then $sign = " "
 
    ;如果 $string 長度沒有小於 $length 時則直接回傳
    If StringLen($string) >= $length Then return $string
 
    If $direction = 1 Then ;PadRight
        Return _StringPad($string & $sign, $length, $sign, $direction)
    Else                   ;PadLeft
        Return _StringPad($sign & $string, $length, $sign, $direction)
    EndIf
EndFunc

3.使用迴圈

檢視原始碼 AutoIt v3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#cs
版本:AutoIt v3 3.2.12.0
環境:Windows XP SP2
#ce
 
#cs
函式名稱:
	_StringPad
函式描述:
	依指定的符號、長度及方向(左右)來補齊字串
需要參數:
	$string         要處理的字串
	[$length]       如果字串不滿 $length 則使用 $sign 補滿,預設為 $string 的長度
	[$sign]         用來補滿用的字串(符號),預設為 " "(空白)
	[$direction]    Pad 的方式,預設為 PadRight
回傳型態:
	String          Pad 後的字串
#ce
Func _StringPad($string, $length = -1, $sign = -1, $direction = 1)
 
    ;若 $length 為 -1 時則 $length 值為 $string 的長度
    If Not $length Then $length = StringLen($string)
    ;若 $sign 為 -1 時則 $sign 值為 " "(空白)
    If Not IsString($sign) Then $sign = " "
 
    ;如果 $string 長度沒有小於 $length 時則直接回傳
    If StringLen($string) >= $length Then return $string
 
    ;計算要補幾位
    $length = $length - StringLen($string)
 
    If $direction = 1 Then ;PadRight
        For $i = 1 To $length
            $string &= $sign
        Next
    Else                   ;PadLeft
        For $i = 1 To $length
            $string = $sign & $string
        Next
    EndIf
 
    Return $string
EndFunc

讓我們先來看看怎樣使用吧:

檢視原始碼 AutoIt v3
1
2
3
4
5
6
7
8
9
;宣告變數
Local $str = "Hello"
 
;補滿長度為 10,補滿的符號及方式使用預設
ConsoleWrite(_StringPad($str, 10) & @CRLF)
;補滿長度為 10,補滿的符號為"#",方式使用預設
ConsoleWrite(_StringPad($str, 10, "#") & @CRLF)
;補滿長度為 10,補滿的符號為"#",方式為 Left
ConsoleWrite(_StringPad($str, 10, "#", 0) & @CRLF)

執行結果

檢視原始碼 AutoIt v3
1
2
3
Hello     
Hello#####
#####Hello

因筆者把這 3 種函式名稱都寫的一樣,且所需的參數也是一樣,因此使用的方法都是一樣的,所以要用那一種方法是沒什麼差的。另外因為第 1 種方式還要額外#include ,所以也是一種考量啦!

筆者會比較傾向第 3 種方式,除了不用再引用額外的 UDF 之外,其實 _StringRepeat 函式 中用的方式也是迴圈的方式來處理的。

發表迴響