54

如何强制使用最多putsn 个字符输出 Ruby 字符串变量,以便如果变量较长,它将被截断,如果较短,它将通过尾随或前导空格扩展?

有没有一些标准的方法来做到这一点?

4

5 回答 5

58

Ruby 支持使用格式字符串,就像许多其他语言一样:

[11](撬)主:0>'%3.3s'%'f'
=> "f"
[12] (pry) main: 0> '%3.3s' % 'foo'
=> “富”
[13] (pry) main: 0> '%3.3s' % 'foobar'
=> “富”

如果要在右侧填充,请-在格式字符串中使用 a:

[14](撬)主:0>'%-3.3s'%'f'
=> "f"
[15](撬)主要:0>'%-3.3s'%'foo'
=> “富”
[16] (pry) main: 0> '%-3.3s' % 'foobar'
=> “富”

您也可以使用printfor sprintf,但我更喜欢更通用%的,例如sprintf.

sprintf文档:

  小号 | 参数是要替换的字符串。如果格式
      | 序列包含一个精度,最多多少个字符
      | 将被复制。

和:

- | 全部 | 左对齐此转换的结果。

如果我不想用空格而是用其他字符填充怎么办?

底层的 Ruby 代码是用 C 编写的,它被硬编码' '为填充字符,所以这是不可能的,除非你想修改源代码,重新编译你的 Ruby,并使用一次性版本的语言. 相反,您可以执行以下操作:

[17] (pry) main: 0> ('%-3.3s' % 'f').gsub(' ', '.')
=> “f..”

这比简单的要复杂得多gsub。如果您需要提供特殊字符,通常最好在不使用格式字符串的情况下调整字符串。格式字符串非常强大,但它们并不完全灵活。

否则,我会选择类似@steenslag 的解决方案,这是您自己的解决方案的基础。你失去了使用格式字符串的能力,不得不依靠连接你的字符串或类似的东西来获得列输出,但它也可以工作。

于 2013-02-05T19:10:12.137 回答
51

使字符串固定长度更短

  str_var.slice(0..10) # starts at the first letter

使字符串固定长度更长

  str_var.ljust(10, ' ')

它们可以组合成类似的东西:

  (str_var.length > 10) ? str_var.slice(1..10) : str_var.ljust(10, ' ')

str_var当然,你的字符串在哪里

于 2013-02-05T19:24:41.960 回答
10
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.

于 2013-02-05T19:37:09.820 回答
6

对于纯 Ruby one 班轮,您可以这样做:

(str + ' ' * length)[0,length]

这将产生:

str = "Hello"
length = 10
=> "Hello     "

或者:

str = "Hello"
length = 2
=> "He"
于 2016-01-07T11:24:24.557 回答
1

If you're talking about a method to truncate strings I would check out ActionView::Helpers::TextHelper#truncate

From the examples:

truncate("Once upon a time in a world far far away")

# => Once upon a time in a world...
于 2013-02-05T19:15:15.217 回答