2011年4月13日 星期三

Lua 字串控制

字串控制之簡單函式:
string.len(s) 返回字串s的長度;
string.rep(s, n) 返回重複n次s的字串;例如:string.rep("A",4) = AAAA
string.lower(s) 將s中的大寫字母轉換成小寫
string.upper(s) 將s中的小寫字母轉換成大寫
string.sub(s,i,j) 函數擷取字串s的從第i個字符到第j個字符之間的字串。



Lua中,字串的第一个字符索引從1開始。
也可以使用負索引,負索引從字串的結尾向前計數:-1指向最後一個字符,-2指向倒数第二個 ....。
例如: string.sub(s, 1, j) 返回字串s的長度為j的前一個;
string.sub(s, j, -1)返回從第j個字符開始的後一個。
如果不提供第3個参数,default值為-1
例如:
s = "[in brackets]"
print(string.sub(s, 2, -2)) --> in brackets
记住:Lua中的字串是不變的。string.sub函数以及Lua中其他的字串操作函数都不會改變字串的值,而
是返回一個新的字串。一個常見的錯誤是:
string.sub(s, 2, -2)
上面的這函数不會改變字串s的值。如果想修改一個字串的值,你必须將變量賦給一個新的字串:
s = string.sub(s, 2, -2)


字符和數字之間轉換之函數:
string.char 擷取0個或多個整數,將每一個數字轉換成字符,然後把每一個字符連接起來成字串,然後return。
string.byte(s, i) 將字串s的第i個字符轉換成整數。第二個參數i可以更改,defult為i=1
例如:
print(string.char(97)) --> a
i = 99; print(string.char(i, i+1, i+2)) --> cde
print(string.byte("abc")) --> 97
print(string.byte("abc", 2)) --> 98
print(string.byte("abc", -1)) --> 99
============================================================================
另外,一個很常需要用到的指令:
string.format(format, 對應數據) 用來生成特定格式的字串。

format格式如下:
%c - 接受一個數字,並轉化為ASCII碼
%d, %i - 接受一個數字,並轉化為有符號之整數
%u - 接受一個數字,並轉化為無符號之整數
%o - 接受一個數字,並轉化為八進位法格式
%x - 接受一個數字,並轉化為十六進位法,且使用小寫字母
%X - 接受一個數字,並轉化為十六進位法,且使用大寫字母
%e - 接受一個數字,並轉化為科學計數法,且使用小寫字母
%E - 接受一個數字,並轉化為科學計數法,且使用大寫字母
%f - 接受一個數字,並轉化為浮點數格式
%g(%G) - 接受一個數字,並轉化為%e (%E, 或%G)及%f中較短的格式
%q - 接受一個字串,並轉化為可安全被Lua編譯器讀入之格式
%s - 接受一個字串,並按照給定的參數格式格式化字串

格式化細節,可以在%符號後添加參數. 參數如下的順序:
(1) 符號: 一個+號表示其後的數字,將讓正數顯示正號,不填寫的情況只有負數顯示負號(default)
(2) 佔位符號: 一個0, 在後面指定了字串寬度時佔位用,不填寫的情況佔位符號是空格
(3) 對齊標誌: 在指定了字串寬度時,不填寫以向右對齊,填入-號可改為向左對齊增加
(4) 寬度數值
(5) 小數位數/字串裁切: 在寬度數值後增加的小數部分n, 若後接f(浮點數轉換, 如%6.3f)则設定該浮點數的小數只保留n位, 若後接s(字串轉換, 如%5.3s)则設定該字串只顯示前n字

例如:
print(string.format("pi = %.4f", PI))
--> pi = 3.1416
PS: %.4f代表小數點後面有4位小數的浮點數。

d = 5; m = 11; y = 1990
print(string.format("%02d/%02d/%04d", d, m, y))
--> 05/11/1990
PS: %02d代表以固定的二位顯示十進位數,不足的補0。
而%2d前面没有指定0,不足二位會以空白補足。

tag, title = "h1", "a title"
print(string.format("<%s>%s", tag, title, tag))
--> <h1>a title</h1>

格式話部分可參考Lua手冊或C手冊(Lua採用標準C的printf函數)

其他例子:

string.format("%%c: %c", 83)            输出S
string.format("%+d", 17.0)              输出+17
string.format("%05d", 17)               输出00017
string.format("%o", 17)                 输出21
string.format("%u", 3.14)               输出3
string.format("%x", 13)                 输出d
string.format("%X", 13)                 输出D
string.format("%e", 1000)               输出1.000000e+03
string.format("%E", 1000)               输出1.000000E+03
string.format("%6.3f", 13)              输出13.000
string.format("%q", "One\nTwo")         输出"One\
                                          Two"
string.format("%s", "monkey")           输出monkey
string.format("%10s", "monkey")         输出    monkey
string.format("%5.3s", "monkey")        输出  mon

PS: 本文參考網頁Lua文字控制

沒有留言:

張貼留言