如何将Ruby字符串强制为n个字符

时间:2013-02-05 19:04:18

标签: ruby string variables string-length

如何使用puts强制Ruby字符串变量输出到n个字符,这样如果变量更长,它将被截断,如果更短,它将通过尾随或前导空格扩展?

有没有一些标准方法可以做到这一点?

5 个答案:

答案 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"

您也可以使用printfsprintf,但我更喜欢更通用的%,就像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...