天天看點

格式化字元串格式化字元串

格式化字元串

格式化函數

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)