格式化字符串
格式化函數
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、格式語法示例
| 格式代碼 | 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.2d | ######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.2e | 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)
總結
- 上一篇: 探索c#之跳跃表(SkipList)
- 下一篇: python practive