如何使用puts
强制Ruby字符串变量输出到n个字符,这样如果变量更长,它将被截断,如果更短,它将通过尾随或前导空格扩展?
有没有一些标准方法可以做到这一点?
答案 0 :(得分:51)
Ruby支持使用格式字符串,就像许多其他语言一样:
[11] (pry) main: 0> '%3.3s' % 'f' => " f" [12] (pry) main: 0> '%3.3s' % 'foo' => "foo" [13] (pry) main: 0> '%3.3s' % 'foobar' => "foo"
如果要在右侧填充,请使用格式字符串中的-
:
[14] (pry) main: 0> '%-3.3s' % 'f' => "f " [15] (pry) main: 0> '%-3.3s' % 'foo' => "foo" [16] (pry) main: 0> '%-3.3s' % 'foobar' => "foo"
您也可以使用printf
或sprintf
,但我更喜欢更通用的%
,就像sprintf
一样。
来自sprintf
文档:
s | Argument is a string to be substituted. If the format | sequence contains a precision, at most that many characters | will be copied.
和
- | all | Left-justify the result of this conversion.
如果我想填充空格而不是其他字符怎么办?
底层的Ruby代码是用C语言编写的,并且硬编码使用' '
作为填充字符,所以这是不可能直接的,除非你想修改源代码,重新编译你的Ruby,并使用这种语言的一次性版本。相反,你可以做类似的事情:
[17] (pry) main: 0> ('%-3.3s' % 'f').gsub(' ', '.') => "f.."
这比简单的gsub
复杂得多。如果需要提供特殊字符,通常最好不使用格式字符串来调整字符串。格式字符串非常强大,但它们并不完全灵活。
否则,我会选择@ steenslag的解决方案,这是推销自己的解决方案。你失去了使用格式字符串的能力,不得不依靠连接你的字符串或类似的东西来获得柱状输出,但它也可以工作。
答案 1 :(得分:33)
使字符串固定长度更短:
str_var.slice(1..10)
使字符串固定长度更长:
str_var.ljust(10, ' ')
它们可以合并为:
(str_var.length > 10) ? str_var.slice(1..10) : str_var.ljust(10, ' ')
str_var
当然是你的字符串
答案 2 :(得分:8)
class String
def fix(size, padstr=' ')
self[0...size].rjust(size, padstr) #or ljust
end
end
p 'lettersletters'.fix(9) #=> "lettersle"
p 'letters'.fix(10, '.') #=> "...letters"
将slice
方法([])与rjust
合并。
答案 3 :(得分:3)
对于纯粹的Ruby内衬,您可以这样做:
(str + ' ' * length)[0,length]
将产生:
str = "Hello"
length = 10
=> "Hello "
或:
str = "Hello"
length = 2
=> "He"
答案 4 :(得分:1)
如果您正在谈论截断字符串的方法,我会查看ActionView::Helpers::TextHelper#truncate
来自示例:
truncate("Once upon a time in a world far far away")
# => Once upon a time in a world...