格式化字元串
格式化函數
string.format用來格式化字元串(按指定的規則連接配接字元串或輸出其他變量并傳回新的字元串) 。
使用方法與C語言的printf函數相同(實際上很多程式設計語言中都有同樣的格式化函數).
str = string.format(fm,...);
第一個參數用fm表示輸出的格式,每個%符号後面是一個
格式化表達式
,每個格式化表達式按順序對應後面的參數。
是以用了N個格式化表達式,就必須在後面添加N個參數。
下面是一個簡單的例子:
int = 123;
str = "字元串"
//下面的%s對應參數str, %i對應參數int
str = string.format("這是字元串:'%s' 這是數字值 %i",str,int);
io.open()
io.print(str);
//%05i表示格式化為至少五位的數字,不足在前面補0
str = string.format("%05i",int);
io.print(str);
格式化文法
格式化表達式:
%[零個或多個标志][最小字段寬度][精度][修改符]格式碼
注意:[]方括号表示可選參數
1、格式碼
代碼 | 參數 | 含義 |
---|---|---|
c | 數字值(number) | 參數被裁剪為8位位元組碼并作為字元進行列印。 |
i,d | 數字值(number) | 參數作為一個十進制整數列印。如果給出了精度而且值的位數小于精度位數,前面就用0填充。 |
u,o,x,X | 數字值(number) | 參數作為一個無符号數字值列印,u使用十進制,o使用八進制,x或X使用十六進制,兩者的差別是x約定使用abcdef,而X約定使用ABCDEF。 |
e,E | 數字值(number) | 參數根據指數形式列印。例如,6.023000e23是使用代碼e,6.023000E23是使用代碼E。小數點後面的位數由精度字段決定,預設值是6。 |
f | 數字值(number) | 參數按照的正常浮點格式列印。精度字段決定小數點後面的位數,預設值是6。 |
g,G | 數字值(number) | 參數以%f或%e(如G則%E)的格式列印,取決于它的值。如果指數大于等于-4但小于精度字段就使用%f格式,否則使用指數格式。 |
s | 字元串值(string) | 列印一個字元串。 |
q | (無) | 列印一個字元串,并将字元串置于一對引号中,如果字元串中包含引号換行等自動添加轉義符。如果要讀取一個字元串傳為代碼。為避免使用者惡意注入引号等特殊字元,可以使用%q進行格式化。 |
% | (無) | 取消%轉義列印一個%字元,即用%%表示本來的%。 |
2、 标志
标志 | 含義 |
---|---|
- | 值在字段中做對齊,預設情況下是右對齊。 |
當數值為右對齊時,預設情況下是使用空格填充值左邊未使用的列。這個标志表示用零填充,它可用于d,i,u,o,x,X,e,E,f,g和G代碼。使用d,i,u,o,x和X代碼時,如果給出了精度字段,零标志就被忽略。如果格式代碼中出現了負号,零标志也沒有效果。 | |
+ | 當用于一個格式化某個有符号值代碼時,如果值非負,正号标志就會給它加上一個正号。如果該值為負,就像往常一樣顯示一個負号。在預設情況下,正号并不會顯示。 |
空格 | 隻用于轉換有符号值的代碼。當值非負時,這個标志把一個空格添加到它開始的位置。注意這個标志和正号标志是互相排斥的,如果兩個同時給出,空格标志便被忽略。 |
# | 選擇某些代碼的另一種轉換形式: |
用于... #标志...
o 保證産生的值以一個零開頭
x,X 在非零值前面加0x字首(%X則為0X)
e,E,f 確定結果始終包含一個小數點,即使它後面沒有數字
g,G 和上面的e,E和f代碼相同。另外,綴尾的0并不從小數中去除
3、 字段寬度
字段寬度是一個十進制整數,用于指定将出現在結果中的最小字元數。如果值的字元數少于字段寬度,就對它進行填充以增加長度。
4、 精度
精度以一個句點開頭,後面跟一個可選的十進制數。如果未給出整數,精度的預設值為零。
對于d,i,u,o,x和X類型的轉換,精度字段指定将出現在結果中的最小的數字個數并覆寫零标志。如果轉換後的值的位數小于寬度,就在它的前面插入零。如果值為零且精度也為零,則轉換結果就不會産生數字。
對于e,E和f類型的轉換,精度決定将出現在小數點之後的數字位數。
對于g和G類型的轉換,它指定将出現在結果中的最大有效位數。
當使用s類型的轉換時,精度指定将被轉換的最多的字元數。
如果用于表示字段寬度和/或精度的十進制整數由一個星号代替,那麼string.format的下一個參數(必須是個整數)就提供寬度和(或)精度。是以,
這些值可以通過計算獲得而不必預先指定。
5、格式文法示例
格式代碼 | A | ABC | ABCDEFGH |
---|---|---|---|
%s | A | ABC | ABCDEFGH |
%5s | ####A | ##ABC | ABCDEFGH |
%.5s | A | ABC | ABCDE |
%5.5s | ####A | ##ABC | ABCDE |
%-5s | A#### | ABC## | ABCDEFGH |
格式代碼 | 1 | -12 | 12345 | 123456789 |
---|---|---|---|---|
%d | 1 | -12 | 12345 | 123456789 |
%6d | #####1 | ###-12 | #12345 | 123456789 |
%.4d | 0001 | -0012 | 12345 | 123456789 |
%6.4d | ##0001 | #-0012 | #12345 | 123456789 |
%-4d | 1#### | -12# | 12345 | 123456789 |
%04d | 0001 | -012 | 12345 | 123456789 |
%+d | +1 | -12 | +12345 | +123456789 |
格式代碼 | 1 | .01 | .00012345 | 12345.6789 |
---|---|---|---|---|
%f | 1.000000 | 0.010000 | 0.000123 | 12345.678900 |
%10.2f | ######1.00 | #####0.01 | ######0.00 | ##12345.67 |
%e | 1.000000e+00 | 1.000000e-02 | 1.234500e-04 | 1.234568e+04 |
%.4e | 1.0000e+00 | 1.0000e-02 | 1.2345e-04 | 1.2346e+04 |
%g | 1 | 0.01 | 0.00012345 | 12345.7 |
格式代碼 | 6.023e23 |
---|---|
%f | 60229999999999975882752.000000 |
%10.2f | 60229999999999975882752.00 |
%e | 6.023000e+23 |
%.4e | 6.0230e+23 |
%g | 6.023e+23 |
用上面的格式化函數可以輕松實作數字的進制轉換( 請參考:數值與進制)
io.open()
//數字轉換為二進制字元串
str = string.format("%b",23 );
io.print(str)
//二進制字元串轉換為數字
n = tonumber(str,2)
//數字轉換為八進制字元串
str = string.format("%o",23 );
io.print(str)
//八進制字元串轉換為數字
n = tonumber(str,8)
//數字轉換為十六進制字元串
str = string.format("%x",23 );
io.print(str)
//十六進制字元串轉換為數字
n = tonumber(str,16)