设置 | 登录 | 注册

作者共发了1篇帖子。

sprintf 格式

1楼 蓝晶の骑士 2011-2-10 23:53

sprintf 格式

Ruby 的 sprintf 格式與 C 語言的 sprintf(3) 基本相同。但還是有些差別,比如它沒有如 short 或 long 等針對 C 特有類型的修飾符,它包含 2 進制數的指示符 (%b),它不支持 sprintf 的方言式的語法。
下面就對 ruby 的 sprintf 格式進行詳細的說明。
sprintf 格式的規格如下所示。[] 中的部分是可選的。
%[標識符][寬度][.精度]指示符
若想輸出「%」本身時,請這樣「%%」處理。
下面就分別介紹一下各元素的用法。
標識符標識符包括「#」,「+」,「 」(空格),「-」和「0」這 5 個。

#
使用 2 進制、8 進制、16 進制的指示符(「b」,「o」,「x」,「X」)時,會分別添加「0b」,「0」,「0x」,「0X」前綴。
p sprintf("%#b", 10) # => "0b1010" p sprintf("%#o", 10) # => "012" p sprintf("%#x", 10) # => "0xa" p sprintf("%#X", 10) # => "0XA"
對於浮點數(「f」,「e」,「E」,「g」,「G」),則必定在輸出中添加「.」。
p sprintf("%.0f", 10) # => "10" p sprintf("%#.0f", 10) # => "10." p sprintf("%.0e", 10) # => "1e+01" p sprintf("%#.0e", 10) # => "1.e+01"
「g」,「G」除了具有上述特性外,還會在末尾添加多餘的 0。
p sprintf("%.05g", 10) # => "10" p sprintf("%#.05g", 10) # => "10.000"
+
使輸出字符串帶上符號。如果是正數的話,就會添加「+」。它只對數值指示符(「d」,「i」,「b」,「o」,「x」,「X」,「u」,「f」,「e」,「E」,「g」,「G」)起作用。另外,如果是「b」,「o」,「x」,「X」,「u」的話,則會為負數添加「-」。
p sprintf("%d", 1) # => "1" p sprintf("%+d", 1) # => "+1" p sprintf("%x", -1) # => "..f" # ".." 表示 f 無限延續 p sprintf("%+x", -1) # => "-1"
「 」(空格)
與「+」相同,用空格來代替正號「+」。它只對數值指示符(「d」,「i」,「b」,「o」,「x」,「X」,「u」,「f」,「e」,「E」,「g」,「G」)起作用。
p sprintf("%d", 1) # => "1" p sprintf("%+d", 1) # => "+1" p sprintf("% d", 1) # => " 1" p sprintf("%x", -1) # => "..f" p sprintf("% x", 1) # => " 1" p sprintf("% x", -1) # => "-1"
-
使輸出內容靠左。若尚未指定「寬度」的話,則不起作用。
0
當輸出內容靠右時,使用「0」而並非空格來填充多餘部分。
它只對數值指示符(「d」,「i」,「b」,「o」,「x」,「X」,「u」,「f」,「g」,「G」)起作用(對「e」,「E」無效)。
p sprintf("%010d", 10) # => "0000000010"
與「#」一起使用時,輸出情況如下。
p sprintf("%#010x", 10) # => "0x0000000a" p sprintf("%#010o", 10) # => "0000000012" p sprintf("%#010b", 10) # => "0b00001010"
它等同於下例。
p sprintf("%#10.8x", 10) # => "0x0000000a" p sprintf("%#10.9o", 10) # => "0000000012" p sprintf("%#10.8b", 10) # => "0b00001010"
通常情況下, 會輸出如下內容。
p sprintf("%#10x", 10) # => " 0xa" p sprintf("%#10o", 10) # => " 012" p sprintf("%#10b", 10) # => " 0b1010"
寬度以非 0 數字開頭的數串負責指定寬度。寬度是指生成字符串的寬度,它不受後文中的「精度」的限制。
確定寬度時,也會考慮「標識符」中附加的「 」,「+」,「-」,「0b」,「0」,「0x」,「0X」的長度。
p sprintf("%#05x", 10) # => "0x00a"
寬度是指「必要的最小寬度」。若結果字符串的寬度超過指定寬度時,指定寬度就會失效。
若將寬度指定為「*」時,將從參數中取得寬度值。
p sprintf("%10s", "foo") # => " foo" p sprintf("%*s", 10, "foo") # => " foo"
精度緊跟在「.」後面的數串表示精度(若只有「.」的話,則為「.0」)。若遇到整數的指示符(「d」,「i」,「b」,「o」,「x」,「X」「u」)的話,精度表示數值部分的長度。
p sprintf("%10.5d", 1) # => " 00001" p sprintf("%#10.5x", 1) # => " 0x00001" p sprintf("%+10.5x", 1) # => " +00001"
若遇到浮點數的指示符(「f」)的話,它表示小數部分的位數。
p sprintf("%10.5f", 1) # => " 1.00000" p sprintf("%10.5f", 10) # => " 10.00000"
若遇到浮點數的指示符(「e」,「E」,「g」,「G」)的話,它表示有效位數。
p sprintf("%10.5e", 1) # => "1.00000e+00" p sprintf("%10.5e", 10) # => "1.00000e+01" p sprintf("%10.5g", 10) # => " 10" p sprintf("%#10.5G", 10) # => " 10.000"
如果是字符串指示符(「s」,「p」)的話,將會按照精度的規定來檢查參數中的字符串長度,並切除多餘部分。若將寬度和精度設為同值的話,則只輸出參數字符串中的符合精度規定的部分。
p sprintf("%10.2s", "foo") # => " fo" p sprintf("%5.5s", "foo") # => # => " foo" p sprintf("%5.5s", "foobar") # => # => "fooba"
若將精度設為「*」的話,將從參數中提取精度的值。
p sprintf("%.5s", "foobar") # => "fooba" p sprintf("%.*s", 5, "foobar") # => "fooba"
指示符指示符指出參數的類型,且是必選的。大體說來它包括


表示字符串的指示符:「c」,「s」,「p」
表示整數的指示符:「d」,「i」,「u」,「b」,「o」,「x」,「X」
表示浮點數的指示符:「f」,「g」,「e」,「E」,「G」 這幾類。

c
將參數的數值(0×255)看作是字符代碼,並輸出對應的字符。若參數並非數值、String、nil、true 或 false 的話,將嘗試用 to_int 方法進行變換。
此時,只有標識符「-」和「寬度」的設定是有效的。
s
輸出字符串。
若參數並非 String 對象的話,將使用 to_s 方法對其進行變換。
p
輸出 Object#inspect 的結果。
p sprintf("%s", [1, 2, 3]) # => "123" p sprintf("%p", [1, 2, 3]) # => "[1, 2, 3]"
d i
以 10 進制整數的形式輸出參數中的數值。
若參數並非整數,則將其變為整數。
u
將參數的數值看作是無符號整數,並以 10 進制整數的形式輸出它。
p sprintf("%u", -1) # => "4294967295"
上面的代碼會輸出 p 0xffff_ffff.to_s。
「%u」會看作是定長整數的參數,對於負整數 n 來說
printf("%u", n)

printf("%d", n & ~(-1 << n.size*8))
是一個意思。
b o x X
分別以 2 進制、8 進制、16 進制、16 進制(大寫字母)字符串的形式輸出整數。
若使用了「#」標識符的話,則分別在前面添加「0b」,「0」,「0x」,「0X」。
若沒有使用「+」,「 」標識符時,將在負數的前面(若有「#」標識符,則在「0x」等的後面)添加「..」。這表示最高位字符無限延伸,它採用了 2 的補數形式來表現負數。
p sprintf("%#b", 10) # => "0b1010" p sprintf("%#o", 10) # => "012" p sprintf("%#x", 10) # => "0xa" # 對負數添加「..」 p sprintf("%#b", -1) # => "0b..1" p sprintf("%#o", -1) # => "0..7" p sprintf("%#x", -1) # => "0x..f" p sprintf("%10x", -1) # => " ..f" p sprintf("%-10x", -1) # => "..f " # 若指定了「精度」的話,則不會添加「..」 p sprintf("%.10x", -1) # => "ffffffffff"
f e E g G
「f」以小數點形式(xxx.xxx)輸出數值。
「e」以指數形式(x.xxxe+xx)輸出數值。
「g」的情況比較特殊。當指數小於 -4 或者超出精度範圍時,它採用「e」方式進行輸出。除此之外,它採用「f」方式進行輸出。另外,它會刪除小數部分尾部的 0。
大寫字母指示符(「E」,「G」)會將輸出中的字母變為大寫形式。
p sprintf("%f", 1.0) # => "1.000000" p sprintf("%e", 1.0) # => "1.000000e+000" p sprintf("%g", 1.0) # => "1" p sprintf("%f", 10.1) # => "10.100000" p sprintf("%e", 10.1) # => "1.010000e+001" p sprintf("%g", 10.1) # => "10.1" p sprintf("%g", 10 ** 6) # => "1e+006" p sprintf("%g", 10 ** -5) # => "1e-005"
精度的缺省值為 6。

内容转换:

回复帖子
内容:
用户名: 您目前是匿名发表。
验证码:
看不清?换一张
©2010-2025 Purasbar Ver3.0 [手机版] [桌面版]
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。