温馨提醒:系统正在全面升级。您可以访问最新站点。谢谢!
在 [] 中同字符串一样可以使用控制码,以及正则表达式 \w、\W、\s、\S、\d、\D(这些都是表示字符簇的简写法)。
请注意,下面包含否定意味的字符簇也将匹配换行符(正则表达式 \W、\D 也是如此)。
p /[^a-z]/ =~ "\n" # => 0sprintf 格式
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”而并非空格来填充多余部分。
它只对数值指示符(“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 进制整数的形式输出参数中的数值。
若参数并非整数,则将其变为整数。