格式化字串

2021-10-17 14:25:02 字數 4522 閱讀 2707

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注入變數的時候,這個變數就找不到會報錯。這個...