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、 標誌標誌
含義-值在字段中做對齊,預設情況下是右對齊。
0當數值為右對齊時,預設情況下是使用空格填充值左邊未使用的列。這個標誌表示用零填充,它可用於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、格式語法示例
格式**
aabc
abcdefgh%sa
abcabcdefgh
%5s####a
##abc
abcdefgh
%.5s
aabc
abcde
%5.5s
####a
##abc
abcde
%-5s
a####
abc##
abcdefgh
格式**1
-1212345
123456789
%d1
-1212345
123456789
%6d#####1
###-12
#12345
123456789
%.4d0001
-0012
12345
123456789
%6.4d##0001
#-0012
#12345
123456789
%-4d1####
-12#
12345
123456789
%04d0001
-012
12345
123456789
%+d+1
-12+12345
+123456789
格式**1
.01.00012345
12345.6789
%f1.000000
0.010000
0.000123
12345.678900
%10.2f######1.00
#####0.01
######0.00
##12345.67
%e1.000000e+00
1.000000e-02
1.234500e-04
1.234568e+04
%.4e1.0000e+00
1.0000e-02
1.2345e-04
1.2346e+04
%g1
0.01
0.00012345
12345.7
格式**6.023e23
%f60229999999999975882752.000000
%10.2f60229999999999975882752.00
%e6.023000e+23
%.4e6.0230e+23
%g6.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)
字串格式化
sprintf snprintf snprintf std stringstream std strstream boost lexical cast boost format cstring format 1 sprintf 使用 sprintf 不安全,輕則破壞資料的準確性,重則程式崩潰。請看下...
格式化字串
通常在使用字串的時候,會對字串進行格式化,然後輸出或呼叫 一般我們使用替換標記對字串進行格式化 string str1 string.format add is 1,2,3 而且在c 中的替換標記可以以任意順序和次數出現在格式化字串中,但替換值是按順序排的,而且替換標記不能超出索引範圍 string...
字串格式化
例如 string s hello map.put target world string res format s,map 有什麼用呢?比如在some.properties中配置模板字串,但是如果用 這種方式,在配置了spring讀取properties注入變數的時候,這個變數就找不到會報錯。這個...