?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
Ruby的sprintf格式與C語言的sprintf(3)基本相同。但還是有些差別: 它沒有針對C特有類型的修飾符,如short或long等; 它包含2進(jìn)制數(shù)的指示符(%b); 它不支持sprintf的方言式的語法。
下面就對ruby的sprintf格式進(jìn)行詳細(xì)的說明。
sprintf格式的規(guī)格如下所示。[]
中的部分是可選的。
%[指定參數(shù)$][標(biāo)識符][寬度][.精度]指示符
若想輸出`%
'本身時, 請這樣`%%
'處理。
下面就分別介紹一下各元素的用法。
標(biāo)識符包括`#', `+', ` '(空格), `-'和`0'這5個。
使用2進(jìn)制、8進(jìn)制、16進(jìn)制的指示符(`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"
對于浮點數(shù) (`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"
使輸出字符串帶上符號。如果是正數(shù)的話, 就會添加`+'。它只對數(shù)值指示符(`d', `i', `b', `o', `x', `X', `u', `f', `e', `E', `g', `G')起作用。另外, 如果是`b', `o', `x', `X', `u'的話, 則會為負(fù)數(shù)添加`-'。
p sprintf("%d", 1) # => "1" p sprintf("%+d", 1) # => "+1" p sprintf("%x", -1) # => "..f" # ".." 表示f無限延續(xù) p sprintf("%+x", -1) # => "-1"
與`+'相同, 用空格來代替正號`+'。它只對數(shù)值指示符(`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"
使輸出內(nèi)容靠左. 若尚未指定寬度的話,則不起作用。
當(dāng)輸出內(nèi)容靠右時, 使用`0'而并非空格來填充多余部分。
它只對數(shù)值指示符(`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"
通常情況下, 會輸出如下內(nèi)容。
p sprintf("%#10x", 10) # => " 0xa" p sprintf("%#10o", 10) # => " 012" p sprintf("%#10b", 10) # => " 0b1010"
以非0數(shù)字開頭的數(shù)串負(fù)責(zé)指定寬度。寬度是指生成字符串的寬度, 它不受后文中的精度的限制。
確定寬度時, 也會考慮標(biāo)識符中附加的" ", "+","-", "0b", "0", "0x", "0X"的長度。
p sprintf("%#05x", 10) # => "0x00a"
寬度是指"必要的最小寬度". 若結(jié)果字符串的寬度超過指定寬度時, 指定寬度就會失效。
若將寬度指定為`*'時, 將從參數(shù)中取得寬度值。
p sprintf("%10s", "foo") # => " foo" p sprintf("%*s", 10, "foo") # => " foo"
緊跟在"."后面的數(shù)串表示精度(若只有"."的話,則為".0")。若遇到整數(shù)的指示符(`d', `i', `b', `o', `x', `X', `u')的話,精度表示數(shù)值部分的長度。
p sprintf("%10.5d", 1) # => " 00001" p sprintf("%#10.5x", 1) # => " 0x00001" p sprintf("%+10.5x", 1) # => " +00001"
若遇到浮點數(shù)的指示符(`f')的話,它表示小數(shù)部分的位數(shù)。
p sprintf("%10.5f", 1) # => " 1.00000" p sprintf("%10.5f", 10) # => " 10.00000"
若遇到浮點數(shù)的指示符(`e', `E', `g', `G')的話,它表示有效位數(shù)。
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')的話,將會按照精度的規(guī)定來檢查參數(shù)中的字符串長度,并切除多余部分。若將寬度和精度設(shè)為同值的話,則只輸出參數(shù)字符串中的符合精度規(guī)定的部分。
p sprintf("%10.2s", "foo") # => " fo" p sprintf("%5.5s", "foo") # => # => " foo" p sprintf("%5.5s", "foobar") # => # => "fooba"
若將精度設(shè)為`*'的話,將從參數(shù)中提取精度的值。
p sprintf("%.5s", "foobar") # => "fooba" p sprintf("%.*s", 5, "foobar") # => "fooba"
指示符指出參數(shù)的類型,且是必選的。大體說來它包括:
這幾類。
將參數(shù)的數(shù)值(0×255)看作是字符代碼,并輸出對應(yīng)的字符。若參數(shù)并非數(shù)值、String、 nil, true或false的話,將嘗試用to_int方法進(jìn)行變換。
此時,只有標(biāo)識符`-'和"寬度"的設(shè)定是有效的。
輸出字符串。
若參數(shù)并非String對象的話,將使用to_s方法對其進(jìn)行變換。
ruby 1.8 特性: 輸出Object#inspect的結(jié)果。
p sprintf("%s", [1, 2, 3]) # => "123" p sprintf("%p", [1, 2, 3]) # => "[1, 2, 3]"
以10進(jìn)制整數(shù)的形式輸出參數(shù)中的數(shù)值。
若參數(shù)并非整數(shù),則使用與Integer函數(shù)相同的規(guī)則將其變?yōu)檎麛?shù)。
將參數(shù)的數(shù)值看作是無符號整數(shù),并以10進(jìn)制整數(shù)的形式輸出它。
p sprintf("%u", -1) # => "..4294967295"
上面的代碼會輸出 p ".." + 0xffff_ffff.to_s。
ruby 1.7 特性: 在version 1.7中,不會附加".."。若是'%u'的話,則將參數(shù)看作是定長整數(shù)。此時,對于負(fù)整數(shù)n來說
printf("%u", n)
與
printf("%d", n & ~(-1 << n.size*8))
是一個意思。
分別以2進(jìn)制、8進(jìn)制、16進(jìn)制、16進(jìn)制(大寫字母)字符串的形式輸出整數(shù)。
若使用了`#' 標(biāo)識符的話,則分別在前面添加"0b", "0", "0x", "0X"。
若沒有使用`+', ` ' 標(biāo)識符時,將在負(fù)數(shù)的前面(若有`#' 標(biāo)識符,則在"0x"等的后面)添加".."。這表示最高位字符無限延伸,它采用了2的補(bǔ)數(shù)形式來表現(xiàn)負(fù)數(shù)。
p sprintf("%#b", 10) # => "0b1010" p sprintf("%#o", 10) # => "012" p sprintf("%#x", 10) # => "0xa" # 對負(fù)數(shù)添加".." 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' 以小數(shù)點形式(xxx.xxx)輸出數(shù)值。
`e' 以指數(shù)形式(x.xxxe+xx)輸出數(shù)值。
`g' 的情況比較特殊。當(dāng)指數(shù)小于-4或者超出精度范圍時,它采用`e'方式進(jìn)行輸出。除此之外,它采用`f'方式進(jìn)行輸出。另外,它會刪除小數(shù)部分尾部的0。
大寫字母指示符(`E', `G')會將輸出中的字母變?yōu)榇髮懶问健?/p>
p sprintf("%f", 1.0) # => "1.000000" p sprintf("%e", 1.0) # => "1.000000e+00" p sprintf("%g", 1.0) # => "1" p sprintf("%f", 10.1) # => "10.100000" p sprintf("%e", 10.1) # => "1.010000e+01" p sprintf("%g", 10.1) # => "10.1" p sprintf("%g", 10 ** 6) # => "1e+06" p sprintf("%g", 10 ** -5) # => "1e-05"
精度的缺省值為6。
若遇到無限大值或NaN(Not a Number)時,輸出情況如下。
p sprintf("%f", 1.0/0) # => "inf" p sprintf("%f", -1.0/0) # => "-inf" p sprintf("%f", 0.0/0) # => "nan" p sprintf("%E", 1.0/0) # => "INF" p sprintf("%E", -1.0/0) # => "-INF" p sprintf("%E", 0.0/0) # => "NAN"
這部分的利用頻率最低,所以放在最后。
表示將使用第nth個參數(shù)進(jìn)行格式化操作。
p sprintf("%1$d, %1$x, %1$o", 10) => "10, a, 12" p sprintf("%3$d, %2$x, %1$o", 1, 2, 3) => "3, 2, 1"
若您不想改變參數(shù)的順序而只想改變格式的話,也可以使用它。
case ENV['LC_TIME'] when /^ja_JP/ fmt = "%1$d年%2$d月%3$d日" else fmt = "%2$02d/%03$2d/%1$02d" end p sprintf(fmt, 1, 4, 22) => "04/22/01"
您也可以先插入"*",然后借用參數(shù)來設(shè)定"寬度"和"精度"的值。
p sprintf("%5.2f", 1); # => " 1.00" p sprintf("%*.*f", 5, 2, 1); # => " 1.00" p sprintf("%1$*2$.*3$f", 1, 5, 2); # => " 1.00"